我有一个java jar文件,它调用java程序(命令)。
当我在命令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中运行完全相同的命令。
答案 0 :(得分:1)
使用
new ProcessBuilder("cmd.exe", "/C", Command);
你已经使用了构造函数的varargs重载。这意味着假定该命令已经被解析为参数。但是,您将完整的Command
作为单个参数传递,这意味着cmd
将整个命令行java -Xmx...
解释为要运行的命令(文件名)。
坚持使用单个字符串,依靠ProcessBuilder
类来解析它,或预先解析所有内容。
至于你遇到的问题,可能有以下几个原因:
out
信息流阻塞了; stderr
,你根本不读,直到已经太晚了(节目已经结束)。您的第二种方法可以通过合并stdout
和stderr
来解决此问题。