अब तक दिए गए सभी उत्तरों में लाइन द्वारा फाइल लाइन को पढ़ना, लाइन को एक के रूप में लेना String
और फिर प्रोसेसिंग करना शामिल है String
।
कोई सवाल नहीं है कि यह समझने का सबसे आसान तरीका है, और अगर फ़ाइल काफी कम है (कहो, तो दसियों हज़ार लाइनें), यह दक्षता के मामले में भी स्वीकार्य होगा। लेकिन अगर फ़ाइल लंबी है , तो इसे दो कारणों से करने के लिए एक बहुत ही अक्षम तरीका है:
- प्रत्येक चरित्र दो बार संसाधित होता है, एक बार निर्माण में
String
, और एक बार प्रसंस्करण में।
- यदि फ़ाइल में बहुत सारी लाइनें हैं, तो कचरा संग्रहकर्ता आपका मित्र नहीं होगा। आप
String
प्रत्येक पंक्ति के लिए एक नया निर्माण कर रहे हैं , और फिर अगली पंक्ति में जाने पर इसे फेंक देते हैं। कचरा संग्रहकर्ता को अंततः इन सभी String
वस्तुओं का निपटान करना होगा जो आप और अधिक नहीं चाहते हैं। तुम्हारे जाने के बाद किसी की सफाई हुई।
यदि आप गति के बारे में परवाह करते हैं, तो आप डेटा के एक ब्लॉक को पढ़ने और फिर लाइन द्वारा लाइन के बजाय बाइट द्वारा इसे संसाधित करने से बहुत बेहतर हैं। हर बार जब आप एक नंबर के अंत में आते हैं, तो आप इसे List
बिल्डिंग में जोड़ते हैं।
यह कुछ इस तरह से सामने आएगा:
private List<Integer> readIntegers(File file) throws IOException {
List<Integer> result = new ArrayList<>();
RandomAccessFile raf = new RandomAccessFile(file, "r");
byte buf[] = new byte[16 * 1024];
final FileChannel ch = raf.getChannel();
int fileLength = (int) ch.size();
final MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0,
fileLength);
int acc = 0;
while (mb.hasRemaining()) {
int len = Math.min(mb.remaining(), buf.length);
mb.get(buf, 0, len);
for (int i = 0; i < len; i++)
if ((buf[i] >= 48) && (buf[i] <= 57))
acc = acc * 10 + buf[i] - 48;
else {
result.add(acc);
acc = 0;
}
}
ch.close();
raf.close();
return result;
}
उपरोक्त कोड मानता है कि यह ASCII है (हालांकि इसे अन्य एन्कोडिंग के लिए आसानी से ट्विक किया जा सकता है), और यह कि कुछ भी जो एक अंक नहीं है (विशेष रूप से, एक स्थान या एक नई रेखा) अंकों के बीच एक सीमा का प्रतिनिधित्व करता है। यह भी मानता है कि फ़ाइल एक गैर-अंक के साथ समाप्त होती है (व्यवहार में, कि अंतिम पंक्ति एक नई रेखा के साथ समाप्त होती है), हालांकि, फिर से, उस मामले से निपटने के लिए इसे घुमाया जा सकता है जहां यह नहीं होता है।
यह इस प्रश्न के उत्तर के रूप में दिए गए किसी भी-दृष्टिकोण के मुकाबले बहुत तेज है String
। इस प्रश्न में एक समान मुद्दे की एक विस्तृत जांच है । आप देखेंगे कि यदि आप बहु-थ्रेडेड रेखा से नीचे जाना चाहते हैं, तो इसमें अभी भी सुधार होने की संभावना है।