有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    系统。setOut更改Java进程的标准输出。不能保证它会影响子进程

    无论如何,仅仅为了捕获单个进程的输出而更改全局设置可能不是一个好主意,特别是如果您希望您的代码在其他代码(库、应用程序等)中运行

    解决方案:不要试图入侵系统。出来从进程的标准输出输入流读取:

    ProcessBuilder builder = new ProcessBuilder().command("where", "where").inheritIO();
    builder.redirectOutput(ProcessBuilder.Redirect.PIPE);
    Process process = builder.start();
    
    String output;
    try (InputStream processStdOut = process.getInputStream()) {
        output = new String(processStdOut.readAllBytes());
    }
    
    process.waitFor();