java.nio.BufferUnderflowException عند معالجة الملفات في سكالا
-
06-07-2019 - |
سؤال
وحصلت مشكلة مماثلة ل هذا الرجل أثناء معالجة <القوي> 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)
}
وماذا أنا دائما تحصل عليه هو أنه سوف يفشل في بالميدان = 75703، في حين أن ملف الإخراج الخاص بي وسوف يكون دائما 64KB (65536 بايت بالضبط). لا يهم أين أضع temp.reset أو System.gc، جميع التجارب ينتهي نفسها.
ويبدو أن تعتمد هذه المشكلة على بعض تخصيص الذاكرة ولكن لا أستطيع أن أجد أي معلومات مفيدة عن هذه المشكلة. أي فكرة عن كيفية حل هذه واحدة؟
وكل ما تبذلونه من يساعد تحظى بتقدير كبير
وتحرير: في الواقع أريد أن معالجة أنها الملفات الثنائية، لذلك هذه التقنية ليست حلا جيدا، وكان كثير يوصي لي لاستخدام BufferedInputStream بدلا
المحلول
لماذا أنت تدعو على reset
في Source
قبل انتهائه بالتكرار من خلال الملف؟
val temp = Source.fromFile("./datasource/input.txt")
try {
for (line <- tem p.getLines) {
//whatever
}
finally temp.reset
ويجب أن تعمل على ما يرام مع أي underflows. انظر أيضا هذا السؤال