如何在读取inputStream时避免getRuntime.exec()阻塞?

时间:2011-04-21 19:15:40

标签: java runtime.exec

我在java代码中调用一个位于jar文件中的类(使用java -classpath path / file.jar classname)。

我的问题是当命令genKOSCommand无效时,对input.readLine()的调用将阻止该程序。所以我添加了input.ready()以避免阻止。当我调试程序时,没关系。似乎工作。但是当不在调试中运行时,缓冲区永远不会准备好。

        // Execute a command with an argument that contains a space
        String[] genKOSCommand = new String[] {
                "java",
                "-classpath",
                Config.XDSI_TEST_KIT_HOME + "/xdsitest/lib/xdsitest.jar;"
                        + Config.XDSI_TEST_KIT_HOME + "/xdsitest/classes",
                "ca.etsmtl.ihe.xdsitest.docsource.SimplePublisher", "-k",
                "C:/Softmedical/Viewer_Test/xdsi-testkit-2.0.4/xdsihome/usr/data/image14.dcm" };

        Process child = Runtime.getRuntime().exec(genKOSCommand);

        BufferedReader input = new BufferedReader(new InputStreamReader(
                child.getInputStream()), 13107200);

        String line = null;

        if (input.ready()) {
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }

            try {
                child.waitFor();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

关于如何检测已执行命令的问题的任何建议?

谢谢。

1 个答案:

答案 0 :(得分:-2)

您需要在循环中等待BufferedReader准备就绪。

while (input.ready() == false) { /* intentional empty space here */ }

while ((line = input.readLine()) != null) {
    System.out.println(line);
}
/* rest of code follows */