2009-06-26 19 views
5

yo estaba tratando de hacer algo de scripting in Scala, para procesar algunos archivos de registro:¿Por qué recibo un java.nio.BufferUnderflowException en este 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... 

¿Por qué aparece este java.nio.BufferUnderflowException?

NOTA - Estoy de tratamiento 10 archivos de registro, cada una de aproximadamente 1 MB de tamaño

Respuesta

2

Yo también estaría interesado en cuanto a exactamente por qué ocurre esto, pero supongo que tiene que ver con el hecho de que Source es un objeto (es decir, un singleton) y cómo se obtiene transparente restablecer. Puede solucionar el problema de la siguiente manera:

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

la parte importante es la reset - lo que probablemente debería estar en un bloque try-finally (aunque la prueba isDirectory es probablemente útil también)

6

llegué BufferUnderflowException excepción cuando abrí un archivo con el código incorrecto. Contenía caracteres ilegales (de acuerdo con la codificación incorrecta) y se lanzó esta excepción engañosa.

1

Esto es esencialmente una reafirmación de la respuesta de Elazar, pero también obtendrá esta excepción si intenta leer un archivo binario usando scala.io.Source.fromFile.

Me acabo de encontrar con esto (por accidente tratando de leer un .jpg con fromFile) debido a un error muy tonto en algo que escribí ...

Cuestiones relacionadas