簡體   English   中英

BufferedReader 還不是 null .readLine() 返回 null

[英]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)));

和一個班輪! 美麗的! 在這之后將居住在流世界。

BufferedReader.lines()

執行終端流操作后,無法保證讀取器將位於特定位置,從該位置讀取下一個字符或行。

因此,在調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM