java.nio.BufferUnderflowException lors du traitement de fichiers dans Scala
-
06-07-2019 - |
Question
J'ai un problème similaire à ceci mec lors du traitement du fichier journal 4 Mo . En fait, je traite plusieurs fichiers simultanément, mais comme je continue à avoir cette exception, je décide de la tester uniquement pour un seul fichier:
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)
}
Ce que j’obtiens toujours, c’est qu’il échouera à la valeur = 75703, alors que mon fichier de sortie sera toujours à 64 Ko (65 536 octets exactement). Peu importe où je mets temp.reset ou System.gc, toutes les expériences sont identiques.
Il semble que le problème repose sur une allocation de mémoire, mais je ne trouve aucune information utile sur ce problème. Une idée sur la façon de résoudre ce problème?
Toutes vos aides sont grandement appréciées
EDIT: En fait, je souhaite le traiter sous forme de fichiers binaires. Cette technique n’est donc pas une bonne solution. Beaucoup m’avaient recommandé d’utiliser BufferedInputStream à la place.
La solution
Pourquoi appelez-vous reset
sur Source
avant la fin de son itération dans le fichier?
val temp = Source.fromFile("./datasource/input.txt")
try {
for (line <- tem p.getLines) {
//whatever
}
finally temp.reset
Devrait fonctionner correctement sans fondations. Voir aussi cette question