java - 获取继承父进程 IO 的子进程的输出

标签 java io processbuilder

我在获取子进程的输出时遇到问题。通常我会使用process.getInputStream()。然而,在本例中,我将子进程设置为继承父进程的 IO。我需要这样做,因为子进程的输出超出了内核设置的缓冲区,因此将挂起。顺便说一句,我正在使用 Linux。

    //creating a named pipe
    File fifo = fifoCreator.createFifoPipe("fifo");
    String[] command = new String[] {"cat", fifo.getAbsolutePath()};
    process = new ProcessBuilder(command).inheritIO().start(); //Inherit IO

    FileWriter fw = new FileWriter(fifo.getAbsoluteFile());
    BufferedWriter bw = new BufferedWriter(fw);
    bw.write(boxString);
    bw.close();
    process.waitFor();
    fifoCreator.removeFifoPipe(fifo.toString());

    //Gets nothing here
    stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String input = readAllLines(stdInput);

理想情况下,我希望将所有内容保留在内存中,因为我想要良好的性能和更少的垃圾。

有没有办法将子进程的输出重定向到某种数据结构?如果没有,有什么办法得到输出吗?

我正在考虑创建一个单独的线程来获取输出流。

最佳答案

为了避免内核缓冲区问题,您可以使用线程读取输出,如 this question 所示。 。他们称之为 StreamGobbler

关于java - 获取继承父进程 IO 的子进程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121578/

相关文章:

Java:正确的网络 IO 处理?

c - 如何使用C读取文件夹中的所有文件

java - 使用 Java ProcessBuilder 运行 native Windows .exe 产生错误::目录名称无效

java - 我如何使用 Java 在 Linux 中找到计算机类型?

java - 在 Java 中从其他应用程序操作窗口

java - java 包/设置类路径时遇到问题

java - 如何在 SQL (JPA) 中使用带有 IN 运算符的嵌套 SELECT 语句?

java - 使用 java 集合对 Person 的 ArrayList 进行排序

java - Processbuilder-在linux中打开java脚本

java - 为什么 java 中的 processBuilder 在 5 分钟后挂起?