【问题标题】:Println the return values of an executable打印可执行文件的返回值
【发布时间】:2015-03-27 14:39:25
【问题描述】:

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

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

【问题讨论】:

  • 我已经编辑了帖子。
  • 您是使用 javaw 还是 java 可执行文件来运行它? javaw 将隐藏控制台窗口。
  • epidemic.exe 真的返回了什么吗?你要关闭Reader 吗?有没有Exceptions 被抛出?
  • @ESP 如何检查我正在使用什么来运行 exe? Mera 不,我没有例外,似乎 while 循环不起作用。 Epidemic.exe 是从 matlab 部署的,使用 compile application 是一个返回整数向量的函数。
  • 你是如何运行你的 Java 代码的?

标签: java executable


【解决方案1】:

您的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

【讨论】:

  • 为了检查返回值,我只需要 println in.read()?
  • @JoseRamon 只需将其打印为字符,例如System.out.print((char)in.read());.
  • 嗯,它不打印任何东西。
  • @JoseRamon 那么你的进程很有可能不会输出任何东西。尝试先从命令行运行它(而不是从 Java 中)。
  • @OldCurmudgeon 是的,这种情况非常罕见。但尽管如此,我还是更新了代码以避免这种情况。
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2011-01-04
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多