2012-11-29 31 views
0

我想从java文件运行以下内容。
我试图显示的PHP版本,后来将更改为运行PHP文件。从Java运行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

你必须wait的进程来执行,你必须单独的参数:BTW你在运行一个问题任何时候

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一个好主意

+0

为什么要等待过程有什么区别?如果有任何来自'php'的输出,它将在*进程退出之前写入*。如果在读取输出之前等待,则可能导致管道死锁。 –

+0

仍然不能正常工作,只是显示终止:( – Ken

+0

@肯 - 是的...因为这不是解决方案。 –

3

我怀疑问题是下列之一:

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

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


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

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

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

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

@ dystroy的回答说,要做到这一点在Java端:

  1. 启动过程。
  2. 等待过程完成
  3. 读取过程的输出。

但是,如果外部进程写入输出的地段,它不会能够来完成,因为它会被阻塞在写管道。与此同时,Java方面正在等待外部进程完成,然后开始从管道读取数据。

死锁。

+0

当我尝试显示C的目录,与 String [] command2 = {“cmd”,“/ C”,“dir”}; 输出是可怕的C:\ Windows 如何显示C的目录,然后显示C文件的目录,然后是php.exe? – Ken

+0

@Ken - 为php可执行文件使用完整的绝对路径名。 –

+0

@Ken - 还可以使用exec(String [])方法,这样就不会遇到exec(String)错误地分割命令字符串的问题。 –