私はJavaのProcessBuilderを使用してサブプロセスを開始しています。これは、別のJVMで実行する必要がある別のJavaプログラムです。
プロセスからのstdoutストリームとstderrストリームから読み取るために2つのスレッドを開始します。これにより、ストリームバッファーがいっぱいになってもハングしません。Process.waitForの呼び出しは返されますが、ストリームは終了しません。
私が使用しているコードは次のようになります(コマンドは文字列のリストです):
ProcessBuilder pb = new ProcessBuilder(command);
final Process p = pb.start();
final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
final ByteArrayOutputStream errStream = new ByteArrayOutputStream();
Thread outputThread = new Thread() {
@Override
public void run() {
try {
IOUtils.copy(p.getInputStream(), outStream);
} catch (IOException e) {
e.printStackTrace();
}
};
};
outputThread.start();
Thread errorThread = new Thread() {
@Override
public void run() {
try {
IOUtils.copy(p.getErrorStream(), errStream);
} catch (IOException e) {
e.printStackTrace();
}
};
};
errorThread.start();
int returncode = p.waitFor();
outputThread.join();
errorThread.join();
「java-version」や「dir」など、他の何かを実行すると、コードは正常に機能します。実行しようとしているJavaコードにアクセスできますが、System.outでclose()を呼び出す必要があるとは聞いたことがありません。