Java中执行系统命令和命令行
在工作中,会遇到要在CMD中执行命令和命令行的情况。比如要调出Windows的计算器……(确实有这样的需求)。
那么怎样调用才能易操作,易扩展并没有副作用呢?
推荐使用ProcessBuilder。示例代码如下:
try {
ProcessBuilder processBuilder =
new ProcessBuilder("calc.exe");
processBuilder.start();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
首先实例化一个ProcessBuilder,参数就是要执行的命令,然后调用ProcessBuilder.start()方法即可。
注意,这里要执行的命令是要加入到系统Path下的,否则无法调用。
如果你的命令没有加入到系统Path下,那么可以给ProcessBuilder指定工作目录,将其目录指定为包含你要执行命令的目录即可:
processBuilder.directory(new File("E://mydir/"));
如果你要执行的命令只有通过系统CMD才能执行,比如echo,那么怎么办呢?
ProcessBuilder processBuilder = new ProcessBuilder
("cmd.exe","/c","echo","Hello, world!");
第一个参数是要执行的命令,后面的参数都是该命令的参数。通过在命令行执行命令即cmd.exe /c即可。但是需要注意的事,第一个参数必须为执行的命令,后面每个参数都是该命令的参数。
比如
ProcessBuilder processBuilder = new ProcessBuilder
("cmd.exe","/c","ping www.chengjf.com");
或者
ProcessBuilder processBuilder = new ProcessBuilder
("ping", "www.chengjf.com");
都是正确的。但是如果
ProcessBuilder processBuilder = new ProcessBuilder
("ping www.chengjf.com");
那么就是错误的,会抛出IOException。
如果你要获得执行的结果,咋整?比如,你执行了一个ping命令,想拿到执行结果。
try {
ProcessBuilder processBuilder =
new ProcessBuilder("ping","www.chengjf.com");
Process process = processBuilder.start();
InputStream inputstream = process.getInputStream();
// Windows中文操作系统此处要使用gbk转码,否则输出会乱码
BufferedReader bufferedReader =
new BufferedReader(new InputStreamReader(inputstream,"gbk"));
String rs = null;
while((rs = bufferedReader.readLine()) != null){
System.out.println(rs);
}
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
通过ProcessBuilder.start()会生成一个Process,通过调用Process.getInputStream()方法可以获得结果的输入流。这里推荐使用BufferedReader,可以实时获取到命令行的输出,而不是等到命令执行完毕再一起输出。