开发者社区 问答 正文

java.lang.Process清空缓冲区问题

java.lang.Process清空缓冲区问题,普通信息和错误信息都要能及时清除要怎么弄
方法1:如果有普通信息,就清普通信息,如果没有则判断和清理错误信息,都没有则判断是否已结束
问题:发现如果程序即有普通信息,又有错误信息,会一直清理普通信息,不管错误信息,错误信息多了有可能会导致缓冲区爆掉
screenshot
方法2:每次循环都会判断和清理普通信息和错误信息
问题:如果没错误信息,代码运行时会一直停在scErrOut.hasNextLine()里,如果不判断直接nextLine,也是同样的停止,直到进程结束,这样普通信息的缓冲一直没清理,有可能导致普通信息过多爆掉
screenshot

展开
收起
蛮大人123 2016-02-21 16:59:39 3456 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪
    **
     * 阻塞(自动清理输出缓冲区)
     * @param p
     * @return
     * @throws IOException
     */
    public static String waitFor(Process p) throws IOException{
        String str = null;
        InputStream is1 = p.getInputStream(); 
        InputStream is2 = p.getErrorStream();  
        BufferedReader br = new BufferedReader(new InputStreamReader(is1)); 
        while (true) {
            boolean exitFlag = true; 
            if (is1.available() > 0) {
                Character c = new Character( (char) is1.read());
                System.out.print(c); 
                exitFlag = false;
            }
            if (is2.available() > 0) {
                Character c = new Character( (char) is2.read());
                System.out.print(c); 
                exitFlag = false;
            }
            if(exitFlag){
                try {
                    Thread.sleep(100); // Nothing to do, sleep a while...
                    p.exitValue(); // ThrowIllegalThreadStateException, if the subprocess represented by this Process object has not yet terminated.
                    break;
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                } catch (IllegalThreadStateException ex) {
                    // Process still alive
                }
            }
        }
        br.close();
        is1.close();
        p.destroy();
        return str;
    }
    2019-07-17 18:46:09
    赞同 展开评论
问答标签:
问答地址: