2013-11-25 104 views
0

我有一个java jar文件,它会调用一个java程序(命令)。Runtime.getRuntime()。exec挂起

命令生成工作正常,当我运行它在命令promt。

Process proc = Runtime.getRuntime().exec("cmd.exe /C "+ Command); 

     BufferedReader stdIn = new BufferedReader(new 
        InputStreamReader(process.getInputStream())); 

       BufferedReader stdErr = new BufferedReader(new 
        InputStreamReader(process.getErrorStream())); 

      String output=null; 
      while((output=stdIn.readLine())!=null) 
      { 
       System.out.println("output is:"+output); 
       out.write(output); 
       out.newLine(); 

      } 
      while((output=stdErr.readLine())!=null) 
      { 
       System.out.println("error output is:"+output); 
       out.write(output); 
       out.newLine(); 

      } 
      try { 
process.waitFor(); 
.... 
.... 
.... 

我试过的ProcessBuilder:

ProcessBuilder proc = new ProcessBuilder("cmd.exe", "/C", Command);   proc.redirectErrorStream(true); 
proc.start(); 

但是,这将引发错误为:

java.io.IOException: Cannot run program "java -Xmx1024M ......" 
CreateProcess error=2, The system cannot find the file specified 

我可以在其中PROMT作品精绝运行相同的命令。

回答

1

随着

new ProcessBuilder("cmd.exe", "/C", Command); 

您使用的构造函数的可变参数超载。这意味着该命令被假定已经被解析为参数。但是,您将完整的Command作为单个参数传递,这意味着cmd会将整个命令行java -Xmx...解释为仅用于运行的命令(文件名)。

要么坚持单个字符串,要依靠ProcessBuilder类来解析它,或者预先解析所有内容。

至于你有挂的问题,可能有以下几个原因:

  • 也许你out流阻塞;
  • 也许您正在开始的程序写入stderr,根本没有读取,直到它已经太晚(程序结束)。

第二种方法可以通过合并stdoutstderr来解决此问题。

+0

谢谢Marko。命令是这样的:“java -Xmx1024M -Djava.util.logging.file =”log // logs.txt“-classpath lib \ tool.jar; lib \ solver.jar com.tool.section.MainFunc -parameter redo section logo.propery C:\ SectionTool“我不知道如何将它传递给ProcessBuilder:( – kino

+0

Somethnig like'(”cmd.exe“,”/ c“,”java“,”-Xmx1024m“,”-Djava。 util.logging.file = log/logs.txt“,等等。 –

+0

Thanks Marko。(啊..我刚看到一个代码流,看到我们需要跟上现在的相同代码..意思是我们需要使用Process proc = Runtime.getRuntime()。exec(“cmd.exe/C”+ Command);才能找到一个解决方案,这是因为很多代码已经使用BufferedReader写入,如果我们使用BufferedReader,必须重写ProcessBuilder。我们可以通过这种方式解决什么问题? – kino

相关问题