从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
或者其他东西。 - 该命令将版本信息写入其“错误”流而不是其“输出”流。
无论哪种方式,您都需要尝试从错误流中读取。 您应该看到版本信息或来自cmd
或php.exe
的错误消息。
我还应该详细解释为什么@ dystroy的答案是错误的。
exec
做的是创建一个新的外部进程来运行命令。 此过程连接到JVM,以便当您的应用程序写入getOutput()
流时,该流程将转到外部进程“标准输入”,并且当外部进程写入其“标准输出”和“标准错误”时,可以分别使用getInput()
和getError()
流来读取数据。
使用由操作系统提供的“管道”来实现各个流之间的连接。
关于管道的事情是它只具有有限的缓冲能力。 如果一个进程正在写入一端而另一个进程没有读取,则写入过程最终将被迫停止写入。 或者更确切地说,它将在写入系统调用中阻塞 ,等待管道耗尽。
@dystroy的答案说在Java方面这样做:
- 开始这个过程。
- 等待该过程完成
- 读取进程的输出。
但是如果外部进程写入大量输出,它将无法完成,因为它在写入管道时会被阻塞。 与此同时,Java端正在等待外部进程在开始从管道读取数据之前完成。
僵局。