BufferedReader的readLine方法阻塞的处理

       BufferReader的read方法和readLine方法在任何情况下都是阻塞的。readLine方法每次读一行,相对于一个字符/字节地读取、转换、返回来说,它有一个缓冲区,读满缓冲区才返回;一般情况下,都建议使用它们把其它Reader/InputStream包起来,使得读取数据更高效;对于文件来说,经常遇到一行一行的,特别符合情景。

       如果不指定buffer大小,则readLine()使用的buffer有8192个字符。

        在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回,否则一直阻塞。

        readLine方法在遇到终止符、数据流发生异常或者另一端被close()掉时,才会返回null值。

      但是在一些场景下,readLine方法可能被阻塞,一直卡在那里,没有超时时间的设置,程序不往下执行。如何处理这个情况呢?在网上找了好久,没有找到很好的处理方法。我的思路是调用该流的close(),readLine()方法则会抛出异常而终止阻塞。如果想实现阻塞了一段时间后自动中断,那么必然是需要异步,用另外一个线程去监视它,执行close()方法,那么程序则会继续往下执行。在stackoverflow网站上有一个回答提供了一种思路,用了CountDownLatch类:How can I read from a BufferedReader in Java without blocking?  但是他的答案没有解决这个问题。

      下面是我的解决方式:

            long start = System.currentTimeMillis();
            long end = start;
            try {
                while( (end - start) < 5000 && true == readDone ) {
                    TimeUnit.MILLISECONDS.sleep(100);
                    end = System.currentTimeMillis();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

其中readDone表示另外一个执行流的readLine方法的B线程是否读取完毕。如果过了5秒并且还没有读完,那么阻塞了,接下来可以去调用B线程的流的close方法。

       因为直接强行执行close会抛出IO异常,不知道这种方式是否合理?

      

你可能感兴趣的:(Java)