我正在使用 Java 的 ProcessBuilder 来启动一个子进程,这是另一个必须在单独的 JVM 中运行的 Java 程序。
我启动两个线程从进程中读取 stdout 和 stderr 流,这样如果流缓冲区已满,就不会挂起。对 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()。