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ですか?

注 - それぞれのサイズが約 1 MB の 10 個のログ ファイルを処理しています。

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-finallyisDirectory

于 2009-06-26T13:41:50.817 に答える
1

これは本質的にElazarの答えを言い換えたものですが、を使用してバイナリファイルを読み取ろうとすると、この例外も発生しますscala.io.Source.fromFile

fromFile私が書いたものの非常に愚かなバグのために、私はちょうどこれに遭遇しました(誤って.jpgをで読み込もうとしました)...

于 2009-12-31T04:20:18.283 に答える