从Java运行PHP

我试图从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); } 

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

您必须等待进程执行,您必须分离参数:

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

顺便说一句,每当你遇到运行流程的问题时,最好还是查看错误流 。

我怀疑问题是以下之一:

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

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


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

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

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

关于管道的事情是它只具有有限的缓冲能力。 如果一个进程正在写入一端而另一个进程没有读取,则写入过程最终将被迫停止写入。 或者更确切地说,它将在写入系统调用中阻塞 ,等待管道耗尽。

@dystroy的答案说在Java方面这样做:

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

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

僵局。