Java 使用非块I/O从Runtime().exec读取输入

Java 使用非块I/O从Runtime().exec读取输入,java,android,Java,Android,似乎使用BufferedReader读取进程的InputStream 将以某种方式导致块I/O行为。 其效果就像程序没有从进程中获得即时输入。 我知道那时可以读取更多的行,但是BufferedReader 一直等着吧,我终于可以更新台词了 代码如下: While((str=bufferedReader.readLine()!=null) { System.out.println(str); } 是否有某种方法可以在不阻塞的情况下保持进程的读取 在while()条件下?因为进程不会返回nul

似乎使用
BufferedReader
读取进程的
InputStream
将以某种方式导致块I/O行为。 其效果就像程序没有从进程中获得即时输入。 我知道那时可以读取更多的行,但是
BufferedReader
一直等着吧,我终于可以更新台词了

代码如下:

While((str=bufferedReader.readLine()!=null) {
  System.out.println(str);
}
是否有某种方法可以在不阻塞的情况下保持进程的读取
在while()条件下?因为进程不会返回null或任何内容。…

您可以在单独的线程中读取子进程输出。像这样的

static BlockingQueue<String> queue = new LinkedBlockingDeque<>();

public static void main(String[] args) throws Exception {
    Process p = Runtime.getRuntime().exec("cmd /c dir");
    final BufferedReader rdr = new BufferedReader(new InputStreamReader(p.getInputStream()));
    Thread t = new Thread() {
        public void run() {
            try {
                for (String line; (line = rdr.readLine()) != null;) {
                    queue.put(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    t.start();
    for (;;) {
        String line = queue.poll();
        if (line != null) {
            System.out.println(line);
        } else if (!t.isAlive()) {
            break;
        }
    }
}
static BlockingQueue queue=new LinkedBlockingDeque();
公共静态void main(字符串[]args)引发异常{
进程p=Runtime.getRuntime().exec(“cmd/c dir”);
final BufferedReader rdr=新的BufferedReader(新的InputStreamReader(p.getInputStream());
线程t=新线程(){
公开募捐{
试一试{
for(字符串行;(line=rdr.readLine())!=null;){
排队.放(线);
}
}捕获(例外e){
e、 printStackTrace();
}
}
};
t、 start();
对于(;;){
String line=queue.poll();
如果(行!=null){
系统输出打印项次(行);
}如果(!t.isAlive()){
打破
}
}
}

您可以使用该库对外部进程进行非阻塞I/O。把java替换为<代码> PrimeBuffer-<代码>和<代码>进程>代码>。“子进程”是什么意思?通过使用单独的线程,我是否仍能获得正确的输入序列?因为输入的顺序很重要…添加了一个非阻塞示例Dude,我认为这会有所帮助!!!我正在用你们的样品测试。。。。希望它能起作用,提前谢谢。你怎么能想出这个解决方案呢?这和你的工作有关吗???我无法完成代码修改,因为我得赶火车。无论如何,我会在你的支持下对它进行全面的测试。我认为这是可以做到的。再次感谢!