我有这样的代码使用BufferedReader
读取文本文件:BufferedReader.ready()方法确保readLine()方法不返回NULL吗?
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()将返回空值并取消引用 ,这将生成空指针 异常。
当我改变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
- 实际上这是一个无限循环。
这似乎readLine
可能返回null
即使ready
回报true
。但为什么不同Reader
s的行为有所不同?
UPDATE:
我知道正常的方式来阅读文本文件(就像彼得和阿里所示)。但是我从同事那里读了那段代码,并意识到我不知道ready
方法。然后我读了JavaDoc,但不明白block
。然后我做了一个测试并发布了这个问题。所以,提出这个问题的更好的方法可能是:
什么时候输入被阻塞?如何使用ready
方法(或为什么不使用它)?为什么那些2 Reader
(FileReader
和StringReader
)的行为与ready
方法不同?
不幸的是readLine(),ready()只保证有一个字符可用,即read()不会被阻塞。如果存在数据但不是完整的行,readLine()将会阻塞。代码 – 2011-03-09 11:15:32