在工作中,会遇到要在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,可以实时获取到命令行的输出,而不是等到命令执行完毕再一起输出。

标签: Java

添加新评论