BufferedReader的readLine方法

BufferedReader有一个方法叫readLine(),优点:

1、该方法的作用是每次都读一行,可以省略很多手动拼接buffer的步骤;

2、它比较高效,相对于一个字符/字节地读取、转换、返回来说,它有一个缓冲区,读满缓冲区才返回;一般情况下,都建议使用它们把其它Reader/InputStream包起来,使得读取数据更高效。

3、对于文本读取来说,逐行读取,非常相符。

但是,该方法是阻塞方法,如果不指定buffer大小则readLine(),使用的buffer有8192个字符。在达到buffer大小之前,只有遇到“/r”、"/n"、"/r/n"才会返回,否则一直阻塞。这里我就遇到了该问题,从网上也查到了部分方法:

作者:https://blog.csdn.net/u010595903/article/details/51679018的解决方法如下:

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

该作者的思路是:调用该流的close(),readLine()方法则会抛出异常而终止阻塞。如果想实现阻塞了一段时间后自动中断,那么必然是需要异步,用另外一个线程去监视它,执行close()方法,那么程序则会继续往下执行。

参考:https://blog.csdn.net/swingline/article/details/5357581

小结,使用readLine()一定要注意:

  1. 读入的数据要注意有/r或/n或/r/n
  2. 没有数据时会阻塞,在数据流异常或断开时才会返回null
  3. 使用socket之类的数据流时,要避免使用readLine(),以免为了等待一个换行/回车符而一直阻塞
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值