zoukankan      html  css  js  c++  java
  • java执行命令行,以及解决卡死问题

    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 + "
    ");
            }
            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();

    via:https://my.oschina.net/u/222749/blog/2965712

  • 相关阅读:
    【POJ】1204 Word Puzzles
    【POJ】1816 Wild Words
    【HDOJ】1247 Hat’s Words
    【HDOJ】2609 How many
    【POJ】1035 Spell checker
    【POJ】2418 Hardwood Species
    【POJ】1056 IMMEDIATE DECODABILITY
    数列有序!
    绝对值排序
    C语言合法标识符
  • 原文地址:https://www.cnblogs.com/nihaorz/p/12023342.html
Copyright © 2011-2022 走看看