Java 从ProcessBuilder向消费者提供InputStream
我最近遇到了一个问题。 我正在使用ProcessBuilder调用外部进程。进程可以返回人类可读的字符串或压缩的内容。代码如下所示:Java 从ProcessBuilder向消费者提供InputStream,java,Java,我最近遇到了一个问题。 我正在使用ProcessBuilder调用外部进程。进程可以返回人类可读的字符串或压缩的内容。代码如下所示: 对于较小的输入,这是可以的,但是对于较大的单进程块,等待缓冲区清空。使用者代码已经实现,那么是否有其他方法可以使用InputStream从该函数重新运行?问题是,如果使用者线程未使用输入流中超出缓冲区大小的值,则进程将无法写入输入流 如果您不想更改使用者代码,我可以想到的一个解决方案是将所有流程输入流读入StringBuffer,然后将输入流返回到StringB
对于较小的输入,这是可以的,但是对于较大的单进程块,等待缓冲区清空。使用者代码已经实现,那么是否有其他方法可以使用InputStream从该函数重新运行?问题是,如果使用者线程未使用输入流中超出缓冲区大小的值,则进程将无法写入输入流 如果您不想更改使用者代码,我可以想到的一个解决方案是将所有流程输入流读入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:我们正在另一个线程中读取inputstream,以避免阻塞主线程执行
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());
}