从ProcessBuilder向消费者提供InputStream

时间:2015-05-04 13:13:44

标签: java


我有这个问题,我最近偶然发现了 我正在使用ProcessBuilder来调用外部进程。进程可以返回人类可读的字符串或压缩内容。
代码如下所示:

ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
Process p = pb.start();
p.waitFor();
return p.getInputStream();


这对于小输入是可以的,但是对于较大的一个进程块,等待缓冲区被清空。消费者代码已经实现,那么是否有另一种方法可以使用InputStream

从此函数中退出

1 个答案:

答案 0 :(得分:0)

问题是如果消费线程不使用超出缓冲区大小的输入流中的值,则进程将无法写入输入流。

如果您不想更改使用者代码,我可以想到的一个解决方案是将所有进程输入流读入StringBuffer,然后将输入流返回给StringBuffer而不是进程输入流。

InputStream startProcess() {
    ProcessBuilder pb = new ProcessBuilder(args);
    pb.redirectErrorStream(true);
    Process p = pb.start();
    String dummy;
    final StringBuffer buffer = new StringBuffer();
    new Thread(new Runnable() {
       void run(){
           while(dummy = pb.getInputStream().readLine() != null) 
           buffer.append(dummy);
       }
    }).start();
    p.waitFor();
    return new ByteArrayInputStream(buffer.toString().getBytes());
}

PS:我们正在读取不同线程中的输入流,以避免阻塞主线程执行。