我有这个问题,我最近偶然发现了
我正在使用ProcessBuilder
来调用外部进程。进程可以返回人类可读的字符串或压缩内容。
代码如下所示:
ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
Process p = pb.start();
p.waitFor();
return p.getInputStream();
这对于小输入是可以的,但是对于较大的一个进程块,等待缓冲区被清空。消费者代码已经实现,那么是否有另一种方法可以使用InputStream
?
答案 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:我们正在读取不同线程中的输入流,以避免阻塞主线程执行。