我有一个 java jar 文件,它又调用一个 java 程序(命令)。
当我在命令提示符中运行生成的命令时,它工作正常。
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 中运行相同的命令,效果绝对很好。
最佳答案
与
new ProcessBuilder("cmd.exe", "/C", Command);
您已使用构造函数的可变参数重载。这意味着假定该命令已解析为参数。但是,您将完整的 Command
作为单个参数传递,这意味着 cmd
将解释整个命令行 java -Xmx...
作为要运行的命令(文件名)。
要么坚持使用单个字符串,依靠 ProcessBuilder 类来解析它,要么预先解析所有内容。
至于您遇到的挂起问题,可能有以下几个原因:
- 也许您的
out
流被阻塞; - 也许您正在启动的程序会写入
stderr
,而您根本不会读取该内容,直到为时已晚(程序已结束)。
您的第二种方法将通过合并 stdout
和 stderr
来解决此问题。
关于java - Runtime.getRuntime().exec 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20194233/