まずは結果を受け取る構造体。(bean にしたきゃすればいい)
public class ExecutionResult { public String execDir; public String execTarget; public int resultCode; public ArrayList<String> stdResult; public ArrayList<String> errResult; }
シェルの仕様上、戻り値は0-255だから、別にIntでなくていいのかも知れない。まぁいいや。
で、プロセス実行用クラス。
public class ProcessRunner { ProcessBuilder builder; public ProcessRunner(String executionPath, String... commands) { this.builder = new ProcessBuilder(commands); this.builder.directory(new File(executionPath)); } public void addEnvironmentArgument(String name, String value) { this.builder.environment().put(name,value); } public synchronized ExecutionResult exec() throws Exception { Process process = this.builder.start(); StreamReadThread stdReader = new StreamReadThread(process.getInputStream()); StreamReadThread errReader = new StreamReadThread(process.getErrorStream()); stdReader.start(); errReader.start(); process.waitFor(); stdReader.join(); errReader.join(); ExecutionResult result = new ExecutionResult(); result.execDir = this.builder.directory().getAbsolutePath(); result.execTarget = this.builder.command().get(0); result.resultCode = process.exitValue(); result.stdResult = stdReader.getResult(); result.errResult = errReader.getResult(); return result; } } class StreamReadThread extends Thread { private BufferedReader reader; private ArrayList<String> result = new ArrayList<String>(); public StreamReadThread(InputStream io) { reader = new BufferedReader(new InputStreamReader(io)); } @Override public void run() { try { while (true) { String line = reader.readLine(); if (line == null) break; result.add(line); } } catch (Exception e) { } finally { try { reader.close(); } catch (Exception e) {} } } public ArrayList<String> getResult() { return result; } }