这可能是一个微不足道的问题,但我不能轻易找到答案。我有一个简单的Java程序:
System.setOut(new PrintStream(new File("stdout.txt")));
...
...
ProcessBuilder pb = new ProcessBuilder("... some args ...");
pb.inheritIO();
pb.start().waitFor();
我的目的是将流程的所有输出(包括子pb
)存储在stdout.txt
中。但是,这似乎不起作用,pb
的输出被重定向到我的进程父级的标准输出,就像从未调用System.setOut(...)
一样。
有什么方法可以使用pb.inheritIO/pb.inheritOutput
方法重定向到重定向的 System.out
?我错过了一些明显的东西吗我知道我可以通过在线程中手动读取孩子的标准输出来实现旧方式,但这更麻烦。
干杯, 亚切克
答案 0 :(得分:0)
请参阅我的回答https://stackoverflow.com/a/32342557/5226711:
ProcessBuilder
的I / O重定向不会重定向流但是 文件描述符。即使将System.out
设置为另一个流,也不会 更改初始标准输出的文件描述符。ProcessBuilder.inheritIO()
继承父进程的标准 输出/输入/错误文件描述符。
PrintStream
实例未传递给已启动的操作 系统过程,但更像是(它是伪代码,我没有 认为它确实有效):((FileOutputStream) System.out.out).getFD()
或者,更正确:
FileDescriptor.out
是
static final
,表示它不会改变,即使 你将System.out
设置为不同的东西。
关于您的问题,这意味着您必须使用File
和ProcessBuilder.redirectOutput(File)
代替PrintStream
:
ProcessBuilder pb = new ProcessBuilder("... some args ...");
pb.redirectOutput(new File("stdout.txt"));
pb.start().waitFor();
这只将子进程的输出重定向到stdout.txt。
如果要引导父进程和子进程的所有输出,则必须将父进程的System.out重定向到该文件并捕获父进程中子进程的输出并将其输出到重定向的System.out:< / p>
System.setOut(new PrintStream(new File("stdout.txt")));
ProcessBuilder pb = new ProcessBuilder("... some args ...");
Process p = pb.start();
BufferedReader childOutput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = output.readLine()) != null) {
System.out.println(line); // child`s output goes to stdout.txt
}