java.nio.BufferUnderflowException ao processar arquivos em Scala
-
06-07-2019 - |
Pergunta
Eu tenho um problema semelhante ao este cara ao processar 4MB arquivo de log. Na verdade eu estou processando vários arquivos simultaneamente, mas desde que eu continuo recebendo essa exceção, eu decidir apenas testá-lo para um único arquivo:
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)
}
O que eu sempre obter é que ele irá falhar na ITR = 75703, enquanto o meu arquivo de saída será sempre 64KB (65536 Bytes exato). Não importa onde eu coloco temp.reset ou System.gc, todos os experimentos acaba o mesmo.
Parece que o problema depende de alguns alocação de memória, mas não consigo encontrar qualquer informação útil sobre este problema. Qualquer idéia sobre como resolver este?
Toda a sua ajuda são muito apreciados
EDIT:. Na verdade eu quero processá-lo como arquivos binários, assim que esta técnica não é uma boa solução, muitos tinham me recomendar usar BufferedInputStream vez
Solução
Por que você está chamando reset
na Source
antes que ele tenha a iteração acabado através do arquivo?
val temp = Source.fromFile("./datasource/input.txt")
try {
for (line <- tem p.getLines) {
//whatever
}
finally temp.reset
deve funcionar muito bem sem underflows. Veja também esta questão