2009-06-26 13 views
5

stavo cercando di fare un po 'scripting in Scala, per elaborare alcuni file di registro:Perché ricevo un java.nio.BufferUnderflowException in questo 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... 

Perché ricevo questo java.nio.BufferUnderflowException?

NOTA - sto elaborazione a 10 file di log, ciascuno di circa 1 MB di dimensione

risposta

2

mi piacerebbe anche essere interessati come esattamente perché questo sta accadendo, ma direi che è a che fare con il fatto che Source è un oggetto (ad esempio un singleton) e come viene ripristinato in modo trasparente. È possibile risolvere il problema nel modo seguente:

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

Il bit importante è il reset - che dovrebbe probabilmente essere in un blocco try-finally (anche se il test isDirectory è probabilmente utile troppo)

6

ho ottenuto BufferUnderflowException eccezione quando ho aperto un file con l'enconding sbagliato. Conteneva personaggi illegali (secondo la codifica errata) e questa eccezione fuorviante è stata lanciata.

1

Questa è essenzialmente una riaffermazione della risposta di Elazar, ma si otterrà anche questa eccezione se si tenta di leggere un file binario utilizzando scala.io.Source.fromFile.

Ho appena imbattuto in questo (accidentalmente cercando di leggere un jpg con fromFile) a causa di un bug molto stupido in qualcosa che ho scritto ...

Problemi correlati