2009-10-26 37 views
3

我在處理4MB日誌文件時遇到類似問題this guy。其實我同時處理多個文件,但因爲我不斷收到此異常,我決定只是測試它的單個文件:當在Scala中處理文件時發生java.nio.BufferUnderflowException

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它會失敗,而我的輸出文件將始終爲64KB(精確到65536字節)。無論我把temp.reset還是System.gc放在哪裏,所有的實驗結果都一樣。

這似乎是問題依賴於一些內存分配,但我無法找到任何有關此問題的信息。有關如何解決這個問題的任何想法?

你的所有幫助是極大的讚賞

編輯:其實我想處理它作爲二進制文件,所以這個技術是不是一個很好的解決方案,很多原本建議我使用的BufferedInputStream代替。

+1

正在搜索,我找到http://lampsvn.epfl.ch/trac/scala/ticket/1883。還有它的重複。基本上,Java和Scala似乎對文件的編碼持不同意見,最終導致這種下溢。不知道可以做些什麼。 – 2009-10-26 11:19:19

+0

是的。根據票據頁面,爲Scala用戶提供的BufferUnderFlow唯一真正的解決方案就是等待Scala 2.8。 – Ekkmanz 2009-10-26 15:34:10

回答

1

你爲什麼在Source完成迭代通過文件之前調用reset

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

應該工作得很好,沒有下溢。另見this question

相關問題