Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从ProcessBuilder向消费者提供InputStream_Java - Fatal编程技术网

Java 从ProcessBuilder向消费者提供InputStream

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

我最近遇到了一个问题。 我正在使用ProcessBuilder调用外部进程。进程可以返回人类可读的字符串或压缩的内容。代码如下所示:


对于较小的输入,这是可以的,但是对于较大的单进程块,等待缓冲区清空。使用者代码已经实现,那么是否有其他方法可以使用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());
}