[英]BufferedReader not null yet .readLine() returning null
我有一個奇怪的問題,我的代碼看起來不錯(至少對我來說),但在調試器上,實際結果總是錯誤的。
首先是代碼:
private void updateRegistry( String filename ){
BufferedReader database = Init.MANAGER.readFile( Path.getDB(), filename );
REGISTRY.clear();
long maxLines = database.lines().count();
for (int i = 0; i < maxLines; i++) {
try {
String currentLine = database.readLine();
Registry regAdd = new Entry( currentLine );
REGISTRY.add( regAdd );
} catch( Exception e ) {
System.err.println( ERROR.getStackTrace( e ) );
}
}
}
因此,循環中的所有currentLine
變量始終返回null
。
作為REGISTRY
類上的一個常量,它是一個LinkedList
。
和ERROR
另一個常量報告錯誤,這是不相關的。
我知道.readLine()
每個方法調用讀取一行,使每個調用成為要讀取的下一行。
此外,通過使用調試器,我可以確認正在BufferedReader
變量中恢復數據。
然而.readLine()
方法返回 null。 我不知道問題是什么。
我唯一的猜測是我用來計算它們的.lines()
。 這會使流為空嗎? 如果這是問題,我該如何糾正它,因為我需要行數。
我究竟做錯了什么? 我調試了一百次,我沒有做任何事情給我數據。
為了將來參考,我使用了另一篇文章的示例,我更喜歡它而不是 while 循環。 刪除.lines()
變量和循環后
private void updateRegistry( String filename ){ BufferedReader database = Init.MANAGER.readFile( Path.getDB(), filename ); REGISTRY.clear(); try { for ( String currentLine = database.readLine(); currentLine != null; currentLine = database.readLine() ) { Registry regAdd = new Registry( currentLine ); REGISTRY.add( regAdd ); } } catch ( Exception e ){ System.err.println( ERROR.getStackTrace( e ) ); } }
感謝您的幫助,現在我可以更快地完成我的工作任務了! xD
因為,現在我最好的朋友Holger 提到,將直接使用流循環,這使它更加整潔。
database.lines().forEach(currentLine -> REGISTRY.add(new Entry(currentLine)));
和一個班輪! 美麗的! 在這之后將居住在流世界。
執行終端流操作后,無法保證讀取器將位於特定位置,從該位置讀取下一個字符或行。
因此,在調用long maxLines = database.lines().count();
,不保證您之后可以從同一讀者閱讀任何行。 在典型的實現中,此操作消耗所有行。
如果你不能重新獲得一個等效的閱讀器,但真的需要事先計數,唯一的選擇是緩沖它們,例如將所有行收集到一個List
List<String> list=database.lines().collect(Collectors.toList());
獲取大小和內容。
如果您不需要事先進行計數,則可以將計數操作替換為您的實際操作:
database.lines().forEach(currentLine -> REGISTRY.add(new Entry(currentLine));
正如danmec 指出的那樣,即使沒有流 API,您也不需要事先進行計數,當您想要用它做的只是執行迭代時。
BufferedReader.lines()
是 Java 8 中的一個我不太熟悉的新方法。 但是,由於您只想依次處理每一行,因此您通常會使用以下內容:
String currentLine = null;
while ((currentLine = database.readLine()) != null) {
// do processing
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.