java可以执行本地命令行,但是有一个坑,命令执行后,已经执行完毕,但是卡死不返回,这是因为:

命令会返回两个输出流,正确的返回流,和错误的返回流

一般程序的做法是先循环读正确的返回流,再读错误的返回流,当正确的返回流读不完的时候,有可能错误的返回流已经占满了缓存,所以导致了卡死,

解决办法是:

1.单独起一个线程读取错误流,这样的情况下,错误流比较不好保存

2.使用ProcessBuild类,这个类可以把错误流重定向到正确流,这样只读一个流就可以了,不论正确或错误,都能读到返回,下面是个例子

ProcessBuilder pb;
Process process = null;
BufferedReader br = null;
StringBuilder resMsg = null;
OutputStream os = null;
String cmd1 = "sh";
try {
    pb = new ProcessBuilder(cmd1);
    pb.redirectErrorStream(true);
    process = pb.start();
    os = process.getOutputStream();
    os.write(command.getBytes());
    os.flush();
    os.close();

    resMsg = new StringBuilder();
    // get command result
    if (isNeedResultMsg) {
        br = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String s;
        while ((s = br.readLine()) != null) {
            resMsg.append(s + "\n");
        }
        resMsg.deleteCharAt(resMsg.length()-1);
        result = process.waitFor();
    }
} catch (IOException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        if (os != null) {
            os.close();
        }
        if (br != null) {
            br.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (process != null) {
        process.destroy();
    }
}
return resMsg.toString();
12-01 15:52