Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I get a java.nio.BufferUnderflowException in this Scala

I was trying to do some scripting in Scala, to process some log files:

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

Why do I get this java.nio.BufferUnderflowException?

NOTE - I'm processing 10 log files, each about 1MB in size

like image 214
thatismatt Avatar asked Jun 26 '09 11:06

thatismatt


3 Answers

I got BufferUnderflowException exception when I opened a file with the wrong enconding. It contained illegal characters (according to the wrong encoding) and this misleading exception was thrown.

like image 123
Elazar Leibovich Avatar answered Nov 07 '22 10:11

Elazar Leibovich


I'd also be interested as to exactly why this is happening but I'd guess it's to do with the fact that Source is an object (i.e. a singleton) and how it is gets transparently reset. You can fix the problem as follows:

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

The important bit is the reset - which should probably be in a try-finally block (although the isDirectory test is probably useful too)

like image 35
oxbow_lakes Avatar answered Nov 07 '22 10:11

oxbow_lakes


This is essentially a restatement of Elazar's answer, but you will also get this exception if you try to read a binary file using scala.io.Source.fromFile.

I just ran into this (accidentally trying to read a .jpg with fromFile) due to a very stupid bug in something I wrote...

like image 26
overthink Avatar answered Nov 07 '22 10:11

overthink