我有一个奇怪的问题,我的代码看起来很好(至少对我来说),但在调试器和实际结果总是错误的。
首先是代码:
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 mentioned,将直接使用流循环,这使它更整洁。
database.lines().forEach(currentLine -> REGISTRY.add(new Entry(currentLine)));
还有一个班轮!美丽!在此之后,他会留在溪流世界。
答案 0 :(得分:3)
执行终端流操作后,无法保证读者将处于读取下一个字符或行的特定位置。
因此,在调用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
}