java继承和重定向标准输出
我正在尝试为使用ProcessBuilder的类编写测试。继承人和我似乎无法让它发挥作用。我已经将代码剥离到核心,并给出了以下示例,我认为应该将子进程的所有输出写入ByteArrayOutputStream,但没有
环境:Windows7上的Java9.0.4
import java.io.*;
public class ProcessTest {
public static void main(String[] args) throws Throwable {
PrintStream original = System.out;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
System.setOut(ps);
System.out.println("BEGIN");
Process process = new ProcessBuilder().command("where", "where")
.inheritIO().start();
process.waitFor();
System.out.println("END");
String output = new String(baos.toByteArray());
original.println("output = " + output);
}
}
输出为:
C:\Windows\System32\where.exe
output = BEGIN
END
当我查看调试器时,输出流不包含指向where的路径
我在思考这个系统。出发不是在做我想的,但我不确定。我发现其他问题建议使用StreamGrabber,但我认为这适用于Java6和更早版本,而Inheritaio适用于我。任何帮助都将不胜感激。谢谢
编辑
我逐渐意识到,打电话给System.setOut()
并不是我所希望的那样。它不会更改1
的底层文件描述符。如果我在C中这样做,我将使用低级文件描述符。但那不是setOut()
正在做的事情。这只是在改变指针
# 1 楼答案
系统。setOut更改Java进程的标准输出。不能保证它会影响子进程
无论如何,仅仅为了捕获单个进程的输出而更改全局设置可能不是一个好主意,特别是如果您希望您的代码在其他代码(库、应用程序等)中运行
解决方案:不要试图入侵系统。出来从进程的标准输出输入流读取: