为什么我在这个斯卡拉得到java.nio.BufferUnderflowException(Why

2019-07-29 07:04发布

我试图做一些脚本在Scala中 ,要处理一些日志文件:

scala> import io.Source
import io.Source

scala> import java.io.File
import java.io.File

scala> val f = new File(".")
f: java.io.File = .

scala> for (l <- f.listFiles) {
 |   val src = Source.fromFile(l).getLines
 |   println( (0 /: src) { (i, line) => i + 1 } )
 | }
3658
java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Unknown Source)
        at java.nio.HeapCharBuffer.get(Unknown Source)
        at scala.io.BufferedSource$$anon$2.next(BufferedSource.scala:86)
        at scala.io.BufferedSource$$anon$2.next(BufferedSource.scala:74)
        at scala.io.Source$$anon$6.next(Source.scala:307)
        at scala.io.Source$$anon$6.next(Source.scala:301)
        at scala.Iterator$cla...

为什么我得到这个java.nio.BufferUnderflowException

注-我在处理大小10个日志文件,每个文件约1MB

Answer 1:

我也很想,究竟为什么发生这种情况,但我想这是一个事实,即做的Source是一个对象(即单身),以及它是如何被透明地复位。 可以按如下方式解决此问题:

for (l <- g.listFiles if !l.isDirectory) {
 | val src = Source.fromFile(l)
 | println( (0 /: src.getLines) { (i, line) => i + 1 } )
 | src.reset
 | }

最重要的一点是reset -这大概应该是在try-finally块(虽然isDirectory测试可能是有用的太)



Answer 2:

BufferUnderflowException异常,当我打开一个文件与错误enconding。 它含有非法字符(根据错误的编码),这误导抛出异常。



Answer 3:

这实质上是埃拉扎尔的答案的重述,但如果您尝试读取使用的二进制文件,你也将获得这个异常scala.io.Source.fromFile

我只是碰到了这个(不小心试图读取一个.JPG fromFile )由于一个非常愚蠢的错误的东西我写...



文章来源: Why do I get a java.nio.BufferUnderflowException in this Scala