BufferReader中的ready()和readLine()方法的使用和注意事项

问题描述

问题产生是我在访问一个txt文件,读取访问后内容出现的,当使用ready()方法判断时候,会产生读取内容是空的情况,因此对ready()和ReadLine()方法进行详细的了解。

解释

  • readLine()方法
    我们常用的去判断读取回来的数据是否为空的时候通常用的判断方法是:

     while((str = br.readLine()) != null) {
                        Log.d(TAG,"网络请求读取数据"+str);
                        shellList.add(str);
                    }

    这样我们就判断了这一行是否为null,如果不为空就添加到一个String类型的数据当中
    在官方文档当中readLine() 解释如下:
    读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
    返回值:
    包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
    方法解释:
    这个方法一个阻塞的方法,也就是说只要连接没有断开,那么就会一直等待知道有结果返回,返回之后进行读取数据,当读取到数据流末尾的时候就会返回null

  • ready()方法
    在代码当中我们这样用的

    while (br.ready()) {
                        shellList.add(br.readLine());
                }

    判断是否准备好被读取,如果准备好则进行读取

    参看官方文档,文档对这个方法的解释如下:
    判断此流是否已准备好被读取。如果缓冲区不为空,或者底层字符流已准备就绪,则缓冲的字符流准备就绪。
    返回值:
    如果保证下一个 read() 不阻塞输入,则返回 True,否则返回 false。注意,返回 false 并不保证阻塞下一次读取。
    方法解释:
    这个方法是一个非阻塞的方法,如果数据未准备好呗读取则返回false,所以当数据没有准备好的时候,判断是false因此读取的都是空,另外根据官方文档解释,返回结果是false的时候也并不能阻塞下一次读取。

总结

个人理解当使用ready()方法进行判断时候,只有当数据完全缓冲完毕准备就绪,返回结果才为true,才能进行读取,也就是说对于网络文件来说,当数据从网络缓冲到本地之后才能进行读取,而对于readLine()来讲,它属于一个阻塞的方法,只要连接没有断开,那它就会按行读取,直到读取到文件末尾。

写在最后:
上面只是个人理解,如果有错误的地方希望大家及时指正,谢谢

你可能感兴趣的:(学习博客)