Java Println可执行文件的返回值

Java Println可执行文件的返回值,java,executable,Java,Executable,我已经将matlab.m文件部署到windows控制台应用程序中。我部署的matlab文件实际上是一个matlab函数,它没有参数,返回一个整数列表。我正在从java代码中运行该.exe,并使用进程来运行我的可执行文件。我尝试使用以下代码读取返回值: Process process = Runtime.getRuntime().exec("epidemic.exe"); //process.waitFor(); System

我已经将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("....");

编辑:根据建议的更改,我重新更改代码。同样,它似乎不会打印返回的值。如果此代码正常,我如何检查可执行文件是否确实返回值

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

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

还要注意,一个进程有两个输出流:标准输出和标准错误。两者都有一个缓冲区,如果它们中的任何一个在您没有读取它的情况下被填满,那么在尝试写入更多输出时,进程将被阻塞

为了确保进程不会被阻塞,您必须读取其两个输出流,下面是一个如何执行此操作的示例:

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

我已经编辑了这篇文章。你是使用javaw还是java可执行文件来运行它?javaw将隐藏控制台窗口。
epostive.exe
是否实际返回任何内容?您是否正在关闭
读卡器
?是否引发了任何
异常
s?@ESP如何检查我正在使用的内容以运行exe?梅拉:不,我也没有例外,虽然循环不起作用。Premission.exe是使用compile application从matlab部署的,它是一个返回整数向量的函数。您如何运行Java代码?为了检查返回的值,我只需将ln In.read()打印出来?@JoseRamon将其作为字符打印,例如,
System.out.print((char)In.read())
.Hmm它不打印任何内容。@JoseRamon那么您的进程很有可能不输出任何内容。首先尝试从命令行运行它(而不是从Java)。@OldCurmudgeon是的,这是一种非常罕见的情况。但尽管如此,我还是更新了代码以避免这种情况。