java.nio.BufferUnderflowException bei der Verarbeitung von Dateien in Scala
-
06-07-2019 - |
Frage
Ich habe ein ähnliches Problem, dies Typ bei der Verarbeitung von 4 MB Protokolldatei. Eigentlich gleichzeitig ich Verarbeitung mehrerer Dateien, aber da ich diese Ausnahme erhalte ich entscheiden, nur um es zu testen für eine einzelne Datei:
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)
}
Was ich immer bekommen, ist, dass es nicht wird bei itr 75703 =, während meine Ausgabedatei immer 64KB sein wird (65536 Bytes exakt). Egal wo ich setzte temp.reset oder System.gc, alle Versuche bis Ende gleich.
Es scheint, wie das Problem auf einiger Speicherzuweisung beruht, aber ich kann keine nützlichen Informationen zu diesem Problem finden. Jede Idee, wie diese zu lösen?
Alle Ihre hilft sehr geschätzt
EDIT:. Eigentlich mag ich es als binäre Dateien verarbeiten, so dass diese Technik keine gute Lösung ist, hatten viele mich empfehlen BufferedInputStream zu verwenden, anstatt
Lösung
Warum rufst du reset
auf der Source
, bevor es fertig ist durch die Datei iterieren?
val temp = Source.fromFile("./datasource/input.txt")
try {
for (line <- tem p.getLines) {
//whatever
}
finally temp.reset
Sollte ohne Unterschreitungen gut funktionieren. Siehe auch diese Frage