打印可执行文件的返回值

时间:2015-01-28 15:52:33

标签: java executable

我已将matlab .m文件部署到Windows控制台应用程序中。我部署的matlab文件实际上是一个matlab函数,它没有参数并返回一个整数列表。我使用进程来运行我的可执行文件,从java代码运行.exe。我试图使用以下代码读取返回值:

            Process process = Runtime.getRuntime().exec("epidemic.exe");
            //process.waitFor();
            System.out.println("....");

            InputStream in = process.getInputStream();  // To read process standard output
            InputStream err = process.getErrorStream(); // To read process error output

            while (process.isAlive()) {
                while (in.available() > 0 || err.available() > 0) {
                    if (in.available() > 0) {
                        System.out.print((char)in.read()); // You might wanna echo it to your console to see progress
                    }
                    if (err.available() > 0) {
                        err.read(); // You might wanna echo it to your console to see progress
                    }
                }

                Thread.sleep(1);
            }


           System.out.println("....");

编辑:根据提议的更改,我重新更改了我的代码。同样,它似乎不打印返回的值。如果这段代码没问题,我怎么能检查可执行文件是否确实返回值?

1 个答案:

答案 0 :(得分:2)

您的while循环尝试从已启动进程的标准输出中读取整行

我强调了潜在的问题。如果进程没有写整行,或者写入标准错误,例如,reader.readLine()将永远阻止。

另请注意,进程有2个输出流:标准输出和标准错误。两者都有一个缓冲区,如果它们中的任何一个在没有你读取的情况下被填充,那么当尝试写更多输出时,该过程将被阻止。

为确保不阻止进程,您必须阅读其两个输出流,以下是如何执行此操作的示例:

InputStream in = process.getInputStream();  // To read process standard output
InputStream err = process.getErrorStream(); // To read process error output

while (proc.isAlive()) {
    while (in.available() > 0 || err.available() > 0) {
        if (in.available() > 0)
            in.read(); // You might wanna echo it to your console to see progress

        if (err.available() > 0)
            err.read(); // You might wanna echo it to your console to see progress
    }

    Thread.sleep(1);
}

如果要打印从流程输出流中读取的数据,可以这样做:

System.out.print((char)in.read()); // read() returns int, convert it to char