0

我正在尝试从 java 文件运行以下内容。
我正在尝试显示 php 版本,稍后将更改为运行 php 文件。

 Process p = Runtime.getRuntime().exec("cmd /C PHP/php.exe -v");
 BufferedReader in = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }

当我运行程序时,没有错误。但控制台没有显示任何东西:(
谢谢。

4

2 回答 2

4

You have to wait for the process to execute and you must separate the arguments :

Process p = Runtime.getRuntime().exec("cmd", "/C", "PHP/php.exe", "-v");
BufferedReader in = new BufferedReader(new InputStreamReader( p.getInputStream()));
p.waitFor();
String line = null;
while ((line = in.readLine()) != null) {
     System.out.println(line);
}

BTW, any time you have a problem in running a process, it's a good idea to look also at the error stream.

于 2012-11-29T11:06:52.600 回答
3

我怀疑问题是以下之一:

  • php.exe根本没有运行,例如,因为PHP/php.exe应该是PHP\php.exe什么的。
  • 该命令将版本信息写入其“错误”流而不是其“输出”流。

无论哪种方式,您都需要尝试从错误流中读取。您应该看到版本信息或来自cmd或的错误消息php.exe


我还应该详细解释为什么@dystroy 的答案是错误的。

什么exec是创建一个新的外部进程来运行命令。此进程连接到 JVM,因此当您的应用程序写入getOutput()流时,该流会转到外部进程的“标准输入”,而当外部进程写入其“标准输出”和“标准错误”时,数据可以分别使用getInput()getError()流读取。

各个流之间的连接是使用操作系统提供的“管道”实现的。

管道的问题在于它只有有限的缓冲能力。如果一个进程正在向一端写入而另一进程不读取,则写入进程最终将被迫停止写入。或者更准确地说,它会阻塞写入系统调用,等待管道耗尽。

@dystroy 的回答说要在 Java 端执行此操作:

  1. 开始这个过程。
  2. 等待过程完成
  3. 读取进程的输出。

但是如果外部进程写入大量输出,它将无法完成,因为它会在写入管道时被阻塞。同时,Java 端正在等待外部进程完成,然后才开始从管道中读取数据。

僵局。

于 2012-11-29T11:14:57.287 回答