2009-06-26 13 views
5

をjava.nio.BufferUnderflowExceptionを得るのですか私はいくつかのログファイルを処理するために、いくつかのscripting in Scalaをやろうとしました:は、なぜ私がこの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を得るのですか?

NOTE - 私はまた、これが起こっていることが正確な理由として興味があると思い

答えて

2

サイズが1MB約10個のログファイル、それぞれの処理をしていますが、私はそれが実際それをどうするだと思うだろうSourceはオブジェクト(つまりシングルトン)で、どのようにしてが透過的ににリセットされますか。次のように問題を解決することができます

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

重要なビットがあるreset - (isDirectoryテストがあまりにもおそらく有用ですが)おそらく私がBufferUnderflowException例外が発生しました

6

try-finallyブロックであるべきです私が間違ったencondingでファイルを開いたとき。それには不正な文字が含まれています(間違ったエンコーディングに従って)、この誤解を招く例外がスローされました。

1

これは本質的にElazarの答えの再記述ですが、scala.io.Source.fromFileを使用してバイナリファイルを読み込もうとすると、この例外も発生します。私はちょうど原因私が書いた何かでは非常に愚かなバグが(偶然fromFileとの.jpgを読み取ろうとする)は、このに走った

...

関連する問題