ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – BufferedReader.ready()方法确保readLine()方法不返回NULL吗?

2019-09-23 05:10:17  阅读:242  来源: 互联网

标签:java file-io


我有这样的代码使用BufferedReader读取文本文件:

BufferedReader reader=null;
    try {
        reader = new BufferedReader(new FileReader("file1.txt"));

        while (reader.ready()) {
            final String line = reader.readLine();
            System.out.println("<"+line+">");
        } catch (..)
    {
        ...
    }

它工作正常但Findbugs报告警告:

NP_DEREFERENCE_OF_READLINE_VALUE : The
result of invoking readLine() is
dereferenced without checking to see
if the result is null. If there are no
more lines of text to read, readLine()
will return null and dereferencing
that will generate a null pointer
exception.

当我将FileReader更改为StringReader时,即

BufferedReader reader=null;
    try {
        reader = new BufferedReader(new StringReader("ABCD"));

        while (reader.ready()) {
            final String line = reader.readLine();
            System.out.println("<"+line+">");
        } catch (..)
    {
        ...
    }

readLine方法返回null,而ready方法总是返回true – 实际上这是一个无限循环.

这似乎即使ready返回true,readLine也可能返回null.但为什么不同读者的行为会有所不同?

更新:

我知道读取文本文件的正常方法(就像Peter和Ali所说的那样).但我从同事那里读到了那段代码,并意识到我不知道现成的方法.然后我读了JavaDoc,但是不懂块.然后我做了一个测试并发布了这个问题.所以,提出这个问题的更好方法可能是:

输入什么时候会阻塞?如何使用ready方法(或者为什么不使用它)?为什么这两个读者(FileReader和StringReader)在就绪方法方面表现不同?

解决方法:

ready方法告诉我们Stream是否已准备好被读取.

想象一下,您的流正在从网络套接字读取数据.在这种情况下,流可能没有结束,因为套接字尚未关闭,但它可能还没有为下一个数据块做好准备,因为套接字的另一端没有再推送任何数据.

在上面的场景中,我们无法再读取任何数据,直到远程端推送它,因此我们必须等待数据可用,或者关闭套接字. ready()方法告诉我们数据何时可用.

标签:java,file-io
来源: https://codeday.me/bug/20190923/1814042.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有