BufferedReader尚未归零.readLine()返回null

时间:2015-10-06 10:41:45

标签: java java-8 bufferedreader

我有一个奇怪的问题,我的代码看起来很好(至少对我来说),但在调试器和实际结果总是错误的。

首先是代码:

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 ) );
    }
}

Post Link

感谢您的帮助,现在我可以更快地完成工作任务!的xD

现在,我最好的朋友,Holger mentioned,将直接使用流循环,这使它更整洁。

database.lines().forEach(currentLine -> REGISTRY.add(new Entry(currentLine)));

还有一个班轮!美丽!在此之后,他会留在溪流世界。

2 个答案:

答案 0 :(得分:3)

请参阅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 has pointed out,即使没有流API,您也不需要预先计算,当您想要使用它时,正在执行迭代。

答案 1 :(得分:3)

BufferedReader.lines()是Java 8中的一种新方法,我对此并不太熟悉。但是,由于您只想依次处理每一行,您通常会使用以下内容:

String currentLine = null;
while ((currentLine = database.readLine()) != null) {
    // do processing
}