【问题标题】:Jave process getInputStream from subprocess来自子进程的Java进程getInputStream
【发布时间】:2013-03-29 08:55:22
【问题描述】:

我使用 processbuilder fork 一个子进程,我想获取子进程的输出。所以我使用进程的 getInputStream 来获取子进程的输出。我发现父进程只有在子进程退出或子进程的标准输出已关闭。

子进程的 System.out.flush() 不起作用。

但我需要多次获得输出。在这种情况下我该怎么办?

【问题讨论】:

    标签: java process inputstream outputstream


    【解决方案1】:

    没有看到您的代码,也没有确切地知道您的子流程中的具体内容,很难提供帮助。这是一个适用于我的示例,其中子进程打印出文本,等待三秒钟,然后打印出更多文本。在我的机器(Windows XP 上的 Java 6)上,我看到了初始文本、暂停,然后是剩余的文本 - 所有这些都在子进程退出之前。

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.Reader;
    
    
    public class TestProcessBuilder
    {
        public static void main(String args[])
        {
            try
            {
                String threeCommands[] = 
                    { "cmd", "/c", 
                        "dir", // prints out text 
                        "&&",
                        "ping", "127.0.0.1", "-n", "3", ">", "nul", // waits 3 seconds
                        "&&",
                        "dir" // prints out more text
                    };
                ProcessBuilder builder = new ProcessBuilder(threeCommands);
                builder.directory(new File("C://"));
                builder.redirectErrorStream();
    
                Process subProcess = builder.start();
    
                // this reads from the subprocess's output stream
                BufferedReader subProcessInputReader = 
                    new BufferedReader(new InputStreamReader(subProcess.getInputStream()));
    
                String line = null;
                while ((line = subProcessInputReader.readLine()) != null)
                    System.out.println(line);
    
                subProcessInputReader.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。现在我已更改为输出到临时文件中,但我很想知道这两个流如何连接在一起。我认为父进程无法访问内存子进程。那么两个进程之间的通信是不是OS支持的。比如说,子进程将自己的数据输出到OS分配的内存区域中?然后父进程从那个内存中读取它。我很好奇它是如何工作的。
    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2015-10-16
    • 2011-06-24
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多