我正在尝试从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);
}当我运行程序时,没有任何错误。但是控制台没有显示任何内容:(
谢谢。
发布于 2012-11-29 19:06:53
您必须使用wait才能执行进程,并且必须分隔参数:
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);
}顺便说一句,任何时候你在运行进程时遇到问题,看看the error stream都是个好主意。
发布于 2012-11-29 19:14:57
我怀疑该问题是以下问题之一:
例如,
php.exe根本没有运行,因为PHP/php.exe应该是PHP\php.exe或其他值。无论哪种方式,您都需要尝试从错误流中读取。您应该会看到版本信息或来自cmd或php.exe的错误消息。
我也应该详细解释为什么@dystroy的答案是错误的。
exec所做的是创建一个新的外部进程来运行该命令。这个进程连接到JVM,这样当您的应用程序写入getOutput()流时,它将转到外部进程的“标准输入”,而当外部进程写入其“标准输出”和“标准错误”时,可以分别使用getInput()和getError()流读取数据。
各个流之间的连接是使用操作系统提供的“管道”来实现的。
管道的问题是它只有有限的缓冲容量。如果一个进程正在向一端写入,而另一个进程没有读取,则写入进程最终将被迫停止写入。或者更准确地说,它将阻塞写入系统调用,等待流水线排出。
@dystroy的答案是在Java端这样做:
启动进程的process.
但是,如果外部进程写入大量输出,它将无法完成,因为它将在写入管道时被阻塞。同时,Java端正在等待外部进程完成,然后才开始从管道读取数据。
死锁。
https://stackoverflow.com/questions/13624346
复制相似问题