java.lang.Process清空缓冲区问题,普通信息和错误信息都要能及时清除要怎么弄

问题描述

java.lang.Process清空缓冲区问题,普通信息和错误信息都要能及时清除要怎么弄

方法1:如果有普通信息,就清普通信息,如果没有则判断和清理错误信息,都没有则判断是否已结束
问题:发现如果程序即有普通信息,又有错误信息,会一直清理普通信息,不管错误信息,错误信息多了有可能会导致缓冲区爆掉
while (true) {
if (scStdOut.hasNextLine()) {
System.out.println(scStdOut.nextLine()); // Standard Output Information
exitFlag = false;
}else if (scErrOut.hasNextLine()) {
System.err.println(scErrOut.nextLine()); // Error Information
exitFlag = false;
}
if(exitFlag){
try {
Thread.sleep(20); // 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
}
}
}

方法2:每次循环都会判断和清理普通信息和错误信息
问题:如果没错误信息,代码运行时会一直停在scErrOut.hasNextLine()里,如果不判断直接nextLine,也是同样的停止,直到进程结束,这样普通信息的缓冲一直没清理,有可能导致普通信息过多爆掉
while (true) {
if (scStdOut.hasNextLine()) {
System.out.println(scStdOut.nextLine()); // Standard Output Information
exitFlag = false;
}
if (scErrOut.hasNextLine()) {
System.err.println(scErrOut.nextLine()); // Error Information
exitFlag = false;
}
//下面代码同方法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;
}
时间: 2024-10-26 10:29:36

java.lang.Process清空缓冲区问题,普通信息和错误信息都要能及时清除要怎么弄的相关文章

java中如何获取 控制台的输出信息,错误信息,和异常信息

问题描述 java中如何获取控制台的输出信息,错误信息,和异常信息.并把它们输入到一个文件中.请大侠们给小弟一个简单的例子. 解决方案 解决方案二:java控制台的输出信息都是java程序产生的啊,如果是异常通过trycatch捕获输出至文件中即可.解决方案三:java控制台的输出信息本身都是java程序产生的啊,异常可用捕捉的方式获取解决方案四:重定向标准输出.错误输出流就可以了.

急救: java.lang.ClassCastException: $Proxy2 cannot be cast to XXXX 错误

问题描述 我是个新手,这几天写了个小东西,刚开头就磕磕碰碰的,求哥哥大侠们能帮帮我.struts1.3+spring2.0+hibernate3报错信息:[com.jin.bbs.common.ActionExceptionHandler]-[ERROR] java.lang.ClassCastException: $Proxy2 cannot be cast to com.jin.bbs.user.UserManagerImpl at com.jin.bbs.user.presentation

【java】利用异常机制,往前台写错误信息

  有时候,程序可能会报异常,而这些异常,通常需要提示前台操作人员怎么去处理,才能完成业务.   此时,我们只需要在业务层,自己抛出一个异常,自己捕捉之后,调用下类,即可输出到前台.   1.servlet里面可以这样写 try { .... } catch (Exception e) { e.printStackTrace(); this.showWrongMessage(resp, e.getMessage());//调用此方法,输出一个弹出窗口到前台页面,传递message // logg

BottomSheetBehavior 之 java.lang.IllegalArgumentException: The view is not associated with BottomSheetBehavior

  AndroidRuntime: FATAL EXCEPTION: main Process: me.chunsheng.uberdriver, PID: 13674 java.lang.RuntimeException: Unable to start activity ComponentInfo{me.chunsheng.uberdriver/me.chunsheng.uberdriver.MainActivity}: java.lang.IllegalArgumentException:

java web-javaweb运行出java.lang.ClassNotFoundException异常

问题描述 javaweb运行出java.lang.ClassNotFoundException异常 严重: Allocate exception for servlet Web.SearchK java.lang.ClassNotFoundException: Search.searchkey at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) at org.

Exception in thread main java.lang.NoClassDefFoundError错误解决方法_java

错误描述 javac helloworld.java能够通过.但是java helloworld出现错误: hadoop@xuwei-erplab:~/jarfile$ java HelloWorld Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/xuwei/HelloWorld) at java.lang.ClassLoader.defineClass1(N

解决java.lang.IncompatibleClassChangeError

今天整理了Maven的pom.xml文件后,把多个项目用maven集成在了一起,结果在启动Tomcat的时候,遇到一个奇葩的错误: ? 1 2 3 4 5 6 7 8 9 10 严重: Servlet [spring] in web application [/AbcWeb] threw load() exception java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading

android studio-android java.lang.VerifyError

问题描述 android java.lang.VerifyError 使用的是android studio 2.0 由于项目集成比较多的第三方SDK,项目看上去比较大,貌似在没有混淆的情况导致的方法超过了64K,经过不断的搜索资料发现,应该是dex 分包了,在解压APK后发现 有两个class.dex,class.dex和class2.dex,问题就来了,在5.0以上的手机运行是没有问题的,一下的手机运行就出现了java.lang.VerifyError 这样的问题,然后继续搜索,都说使用 co

java.lang.ClassNotFoundException: org.apache.catalina.loader.DevLoader

eclipse tomcat报错:org.apache.catalina.loader.DevLoader java.lang.ClassNotFoundException: org.apache.catalina.loader.DevLoader   这个错误是由于在eclipse的项目中配置了 tomcat属性为 active Devloader. 而且tomcat目录下 \Tomcat \conf\Catalina\localhost  xx.xm中有 <Context path="