2010-08-05 54 views

回答

2

小心,你不创建一个僵局。如果进程正在写入数据,而您正在读取的数据还没有读取,并且正在写入它未读取的数据,则读取/写入同一线程中的进程可能会产生问题。

我倾向于使用一个小图案线这让IO在不同的线程中去:

import java.io.InputStream; 
import java.io.OutputStream; 

public final class Pipe implements Runnable { 

    private final InputStream in; 
    private final OutputStream out; 

    public Pipe(InputStream in, OutputStream out) { 
     this.in = in; 
     this.out = out; 
    } 

    public static void pipe(Process process) { 
     pipe(process.getInputStream(), System.out); 
     pipe(process.getErrorStream(), System.err); 
     pipe(System.in, process.getOutputStream()); 
    } 

    public static void pipe(InputStream in, OutputStream out) { 
     final Thread thread = new Thread(new Pipe(in, out)); 
     thread.setDaemon(true); 
     thread.start(); 
    } 

    public void run() { 
     try { 
      int i = -1; 

      byte[] buf = new byte[1024]; 

      while ((i = in.read(buf)) != -1) { 
       out.write(buf, 0, i); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

这可能会或可能并不适用于你想做什么 - 也许你的处理建立的一套的输入保证在某个预期输出后显示(反之亦然,或者几次迭代)。即一些同步块和一步的交互。

但是,如果您只是在观看某些可能出现的情况,那么这是一个正确方向的良好开端。您将传递一些不同的流,并在一些java.util.concurrent'await(long,TimeUnit)'类型代码中等待响应。 Java IO基本上永远在read()操作中阻塞,所以如果你没有从外部进程得到预期的响应,那么将自己从这些线程中分离出来可以让你在一段时间后放弃。

2

它是这样的(未编译和未经测试)

Process p = Runtime . getRuntime () . exec (...) ; 
Writer w = new java . io . OutputStreamWriter (p . getOutputStream ()) ; 
w . append (yourString) ; 
w. flush () ; 
// read the input back 
相关问题