5

我试图在 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

4

3 回答 3

6

当我打开一个编码错误的文件时出现BufferUnderflowException异常。它包含非法字符(根据错误的编码)并且抛出了这个误导性异常。

于 2009-09-28T22:15:46.643 回答
2

我也很想知道为什么会发生这种情况,但我猜这与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测试可能也很有用)

于 2009-06-26T13:41:50.817 回答
1

这本质上是对 Elazar 答案的重述,但如果您尝试使用scala.io.Source.fromFile.

fromFile由于我写的东西中有一个非常愚蠢的错误,我刚刚遇到了这个(不小心试图用 .jpg 阅读)......

于 2009-12-31T04:20:18.283 回答