执行java命令时如何获取错误信息?

时间:2011-04-21 18:49:44

标签: java

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

这项工作做得很好,但只有在命令形成良好的情况下。如果我弄错了 getRuntime()。exect(命令)就是什么都没说。 Bellow我有工作命令调用。我想在命令不起作用时收到错误消息。如果我在cmd(windows)中犯了一个错误,我会得到一个正确的错误,我可以解决它。但不在我的java应用程序中。

我留下了'if(input.ready())',因为如果我没有在命令行不正确时程序冻结。执行'input.readLine()'时会发生这种情况。

        // 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();
            }
        }

有关如何从执行的命令中获取错误的任何建议吗?

谢谢

3 个答案:

答案 0 :(得分:4)

使用getErrorStream:

BufferedReader errinput = new BufferedReader(new InputStreamReader(
                child.getErrorStream()));

当处理来自不同流的输入时,最好在不同的线程中进行(因为这些调用(readLine等)是阻塞调用。

答案 1 :(得分:3)

通过进程/运行时运行一些command,打印出收到的错误,这是一段更完整的代码:

final String command = "/bin/bash -c cat foo.txt | some.app";
Process p;
    try {
        p = Runtime.getRuntime().exec(command);
    } catch (final IOException e) {
        e.printStackTrace();
    }

    //Wait to get exit value
    try {
        p.waitFor();
        final int exitValue = p.waitFor();
        if (exitValue == 0)
            System.out.println("Successfully executed the command: " + command);
        else {
            System.out.println("Failed to execute the following command: " + command + " due to the following error(s):");
            try (final BufferedReader b = new BufferedReader(new InputStreamReader(p.getErrorStream()))) {
                String line;
                if ((line = b.readLine()) != null)
                    System.out.println(line);
            } catch (final IOException e) {
                e.printStackTrace();
            }                
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

答案 2 :(得分:2)

Process.getErrorStream不是你想要的吗?