• 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

  • 相关阅读:
    剑指offer 39. 是否为平衡二叉树
    剑指offer 38. 二叉树的深度
    剑指offer 16. 合并两个有序链表
    剑指offer 15.链表反转
    剑指offer 58.对称的二叉树
    剑指offer 62. 二叉搜索树的第 k 个结点
    二叉树的前序和中序遍历的非递归实现
    将求模运算转换成与运算,加快运算速度
    Java中数字的格式化输出
    Java中的freopen()
  • 原文地址:https://www.cnblogs.com/nihaorz/p/12023342.html
Copyright © 2020-2023  润新知