我试图调用cmd命令从Java使用进程构建器。然而,我面临的问题很少。
>
这个程序有时没有给出正确的输出。如果我使用process.destroy()方法并得到exitValue,它显示1。如果我注释掉process.destroy()方法,异常出现,进程没有退出。我猜可能是线程竞争条件。但是,没有process.waitFor()的影响。它有时仍然会产生错误的输出。我们如何测试这些情况并找出问题的真正原因?
我需要在cmd中调用一些命令。但是数组元素充当前一个的参数。例如,如果我用elemets作为cmd /Cdir whoami制作数组。那么这会产生错误的输出,因为whoami充当dir的参数。独立向cmd提供命令的正确方法是什么?
下面是具有相同问题的示例代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
public class Sample {
public static void main(String[] args) throws Exception {
//List<String> commandList = Arrays.asList("cmd.exe","dir");
String[] commandList = {"cmd.exe", "/C", "dir"};
//String[] commandList = {"cmd.exe", "/C", "dir", "whoami"};
//String[] commandList = new String[] {"cmd.exe", "/C", "dir"};
ProcessBuilder processBuilder = new ProcessBuilder(commandList);
Process process = processBuilder.start();
//process.waitFor();
BufferedReader iReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String tempStr= "";
StringBuffer buffer = new StringBuffer();
while((tempStr = iReader.readLine())!=null){
buffer.append(tempStr+System.lineSeparator());
}
System.out.println(buffer.toString());
process.destroy();
int exitValue = process.exitValue();
System.out.println(exitValue);
}
}
顺便说一句,StringBuffer已经过时了。改用StringBuilder,因为它没有不必要的同步开销。