背景

前一段时间项目需要在程序里面使用shell命令,就比较纠结,问我导师,导师给我说你可以去百度一下,Java是可以执行shell命令的。听到这个消息我就有点懵了,Java还可以执行Shell命令,有点强大啊!后来在网上搜了一些博文,看了看,还真的是可以的。

代码

public static String execShell(String shell) {
        StringBuilder result = new StringBuilder();
        Process process = null;
        BufferedReader bufferedReaderInfo = null;
        BufferedReader bufferedReaderError = null;
        try {
        	// 执行shell命令,返回了一个进程
            process = Runtime.getRuntime().exec(shell);
            // 等待命令执行完成
            process.waitFor();
            // 获取结果,正常返回是第一个,错误返回是第二个,返回结果只能有一个,要么正常执行,要么执行错误
            bufferedReaderInfo = new BufferedReader(new InputStreamReader(process.getInputStream()));
            bufferedReaderError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String line;
            // 将返回结果存到一个stringbuilder里面,因为StringBuilder是可扩展的,所以不用String
            while (bufferedReaderInfo.readLine() != null || bufferedReaderError.readLine() != null) {
                if (bufferedReaderInfo.readLine() != null) {
                    line = bufferedReaderInfo.readLine();
                } else {
                    line = bufferedReaderError.readLine();
                }
                result.append(line + "\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 释放资源
            if (bufferedReaderError!=null){
                try {
                    bufferedReaderError.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedReaderInfo!=null){
                try {
                    bufferedReaderInfo.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (process!=null){
                process.destroy();
            }

        }
        return result.toString();
    }

原理

Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁进程的方法。在这里创建了一个Process类的对象,然后接收Runtime.exec(”“)的结果,是因为Runtime.exec("") 方法创建一个本机进程,并返回 Process 子类的一个实例。
所以这时候执行shell命令的就是这个Process子类的实例,然后阻塞,等待这个命令执行完成。执行完成之后获取这个进程的执行结果。最后把这个结果用BufferReader存起来放在StringBuilder里。最后返回出去。