java.nio.BufferUnderflowException при обработке файлов в Scala - PullRequest
3 голосов
/ 26 октября 2009

У меня проблема, похожая на этого парня при обработке файла журнала 4MB . На самом деле я обрабатываю несколько файлов одновременно, но так как я получаю это исключение, я решил проверить его на наличие одного файла:

val temp = Source.fromFile("./datasource/input.txt")
val dummy = new PrintWriter("test.txt")
var itr = 0
println("Default Buffer size: " + Source.DefaultBufSize)
try {
    for( chr <- temp) {
        dummy.print(chr.toChar)
        itr += 1
        if(itr == 75703) println("Passed line 85")
        if(itr % 256 == 0){ print("..." + itr); temp.reset; System.gc; }
        if(itr == 75703) println("Passed line 87")
        if(itr % 2048 == 0) println("")
        if(itr == 75703) println("Passed line 89")
    }
} finally {
    println("\nFalied at itr = " + itr)
}

Что я всегда получаю, так это то, что произойдет сбой при itr = 75703, в то время как мой выходной файл всегда будет 64 КБ (65536 байт). Независимо от того, куда я положил temp.reset или System.gc, все эксперименты заканчиваются одинаково.

Кажется, что проблема заключается в некотором распределении памяти, но я не могу найти никакой полезной информации по этой проблеме. Есть идеи, как решить эту проблему?

Все ваши советы очень ценятся

РЕДАКТИРОВАТЬ: На самом деле я хочу обработать его как двоичные файлы, так что этот метод не является хорошим решением, многие рекомендовали мне использовать BufferedInputStream вместо этого.

1 Ответ

1 голос
/ 26 октября 2009

Почему вы вызываете reset на Source до того, как он завершил итерации по файлу?

val temp = Source.fromFile("./datasource/input.txt")
try {
  for (line <- tem p.getLines) {
    //whatever
  }
finally temp.reset     

Должно работать нормально, без потерь. Смотри также этот вопрос

...