我有这样的代码来读取文本文件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 :
调用 readLine() 的结果是
取消引用而不检查
如果结果为空。如果没有
要读取更多行文本,readLine()
将返回 null 并取消引用
这将生成一个空指针
例外。
当我改变时FileReader
to StringReader
, i.e.
BufferedReader reader=null;
try {
reader = new BufferedReader(new StringReader("ABCD"));
while (reader.ready()) {
final String line = reader.readLine();
System.out.println("<"+line+">");
} catch (..)
{
...
}
the readLine
方法返回null
而ready
方法总是返回true
- 这确实是一个无限循环。
这似乎是readLine
可能会回来null
即使ready
回报true
。但为什么不同的行为会有所不同Reader
s?
UPDATE:
我确实知道读取文本文件的正常方法(就像彼得和阿里所示)。但我读了我同事的那段代码并意识到我不知道ready
方法。然后我读了JavaDoc,但不明白block
。然后我做了一个测试并发布了这个问题。因此,提出这个问题的更好方法可能是:
什么时候输入会被阻塞?如何使用ready
方法(或者为什么不使用它)?为什么那2个Reader
s (FileReader
and StringReader
)的行为有所不同ready
method?
Ready 方法告诉我们 Stream 是否准备好被读取。
想象一下您的流正在从网络套接字读取数据。在这种情况下,流可能尚未结束,因为套接字尚未关闭,但它可能尚未准备好接收下一个数据块,因为套接字的另一端尚未推送任何更多数据。
在上面的场景中,在远程端推送数据之前我们无法读取更多数据,因此我们必须等待数据可用,或者套接字关闭。 Ready() 方法告诉我们数据何时可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)