我有這樣的代碼使用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