Почему я получаю исключение java.nio.BufferUnderflowException в этом Scala - PullRequest
5 голосов
/ 26 июня 2009

Я пытался сделать несколько сценариев в 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?

ПРИМЕЧАНИЕ. - Я обрабатываю 10 файлов журнала, каждый размером около 1 МБ

Ответы [ 3 ]

6 голосов
/ 29 сентября 2009

Я получил исключение BufferUnderflowException, когда открыл файл с неправильным завершением. Он содержал недопустимые символы (в соответствии с неправильной кодировкой), и было создано это вводящее в заблуждение исключение.

2 голосов
/ 26 июня 2009

Мне также было бы интересно узнать, почему именно это происходит, но я предполагаю, что это связано с тем фактом, что 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-finally (хотя тест isDirectory, вероятно, также полезен)

1 голос
/ 31 декабря 2009

По сути, это повторение ответа Элазара, но вы также получите это исключение, если попытаетесь прочитать двоичный файл, используя scala.io.Source.fromFile.

Я только что столкнулся с этим (случайно пытаясь прочитать .jpg с fromFile) из-за очень глупой ошибки в чем-то, что я написал ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...