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

时间:2014-05-09 04:03:25

标签: java android

似乎使用BufferedReader来阅读流程' InputStream 将以某种方式导致块I / O行为。 效果就像程序没有从过程中获得即时输入。 我知道当时有更多行可以阅读,但是BufferedReader 只是等待一段时间,然后我终于可以更新线路了。

以下是代码:

While((str=bufferedReader.readLine()!=null) {
  System.out.println(str);
}

是否有某种方法可以在不阻塞的情况下继续读取进程 在while()条件下?因为该过程不会返回null或任何其他....

2 个答案:

答案 0 :(得分:0)

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

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;
        }
    }
}

答案 1 :(得分:0)

您可以使用NuProcess库对外部进程进行非阻塞I / O操作。将其视为Java中ProcessBuilderProcess的替代。