如果文件的最后一行不为空,则LineIterator.hasNext()抛出异常

时间:2015-10-03 01:35:23

标签: java iterator java-io

我有一段看起来像这样的代码(在java中),它使用org.apache.commons.io.IOUtils.lineIterator;

LineIterator iterator = lineIterator(someFile, defaultCharset());
....
while(iterator.hasNext){
 process(iterator);
}

private String process(LineIterator iterator, SomeComplexClass someClass){
 while(iterator.hasNext()){
  //do something using iterator.nextLine()
 }
}

如果输入文件的最后一行是空的,那么这很有效。

Input file:
Line1
Line2
(nothing here. just empty line)

但如果我的输入文件没有空行,那么lineIterator.hasNext()会抛出异常,说“java.lang.IllegalStateException:Stream has closed”

Input file:
Line1
Line2 //there is no empty line after this

这是LineIterator的已知行为吗? 请帮我试着理解为什么会这样。

更新:我在代码中没有看到close()或LineIterator.closeQuietly(iterator)。这会导致问题吗?

2 个答案:

答案 0 :(得分:0)

在文本编辑器中打开文件读取,可以显示像记事本++这样的行号 然后如果最后一行是空的。删除最后一行。

空格并不意味着没有行

答案 1 :(得分:-1)

如果你看一下LineIterator hasNext()LineIterator, 它似乎有一个bug。要工作,它应该在到达文件末尾时将cachedLine设置为null,而是仅设置“已完成”标志。不幸的是,在方法开始时,在完成标志之前检查cachedLine,因此即使到达文件末尾也会生效。