【问题标题】:LineIterator.hasNext() throws exception if last line of the file is not empty如果文件的最后一行不为空,LineIterator.hasNext() 将抛出异常
【发布时间】:2015-10-03 01:35:23
【问题描述】:

我有一段看起来像这样的代码(在 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 already closed”

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

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

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

【问题讨论】:

  • 您是如何获得LineIterator 的?
  • 请公布全部相关代码,lineIterator如何创建,令牌如何消费等。
  • 我正在像这样创建它 LineIterator iterator = lineIterator(someFile, defaultCharset())。我也将它添加到问题中
  • 我无法重现这个。
  • 我查看了更多代码,为问题添加了更多细节。这是因为我将迭代器传递给另一个方法吗?

标签: java iterator java-io


【解决方案1】:

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

空格不代表没有行

【讨论】:

    【解决方案2】:

    如果你查看 LineIterator hasNext() LineIterator, 它似乎有一个错误。为了工作,它应该在到达文件末尾时将 cachedLine 设置为 null,而只设置一个“完成”标志。不幸的是,在方法开始时,cachedLine 在完成标志之前被检查,所以即使到达文件末尾你也会得到 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2014-02-10
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多