java - जावा BufferedReader एक पाठ फ़ाइल के शीर्ष पर वापस?




file file-io (4)

मेरे पास वर्तमान में एक ही टेक्स्ट फ़ाइल पर प्रारंभ हुआ 2 BufferedReader । जब मैं पहले BufferedReader साथ टेक्स्ट फ़ाइल पढ़ रहा हूं, तो मैं शीर्ष से फ़ाइल के माध्यम से एक और पास करने के लिए दूसरा उपयोग करता हूं। एक ही फ़ाइल के माध्यम से एकाधिक पास आवश्यक हैं।

मुझे reset() बारे में पता है, लेकिन इसे कॉलिंग mark() और mark() से पहले फ़ाइल के आकार को जानने की आवश्यकता है, जो मुझे नहीं लगता कि मुझे परेशान होना चाहिए।

विचार? संकुल? Libs? कोड?

धन्यवाद टीजे


"खराब डिजाइन के BufferedReader smacks में निशान () और रीसेट () के बारे में पूरा व्यवसाय।"

आप इस वर्ग का विस्तार क्यों नहीं करते हैं और यह कन्स्ट्रक्टर () में एक चिह्न () करते हैं और फिर topOfFile () विधि में एक खोज (0) करते हैं।

बीआर,
~ एक


Buffered पाठक अनुक्रमिक रूप से एक फ़ाइल पढ़ने के लिए हैं। जो आप खोज रहे हैं वह java.io.RandomAccessFile , और उसके बाद आप फ़ाइल में जहां चाहें वहां ले जाने के लिए seek() का उपयोग कर सकते हैं।

यादृच्छिक अभिगम पाठक इस तरह कार्यान्वित किया गया है:

try{
     String fileName = "c:/myraffile.txt";
     File file = new File(fileName);
     RandomAccessFile raf = new RandomAccessFile(file, "rw");
     raf.readChar();
     raf.seek(0);
} catch (FileNotFoundException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
} catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
}

"rw" एक मोड कैरेक्टर है जो यहां विस्तृत है

अनुक्रमिक पहुंच पाठकों को इस तरह सेटअप करने का कारण यह है कि वे अपने बफर को कार्यान्वित कर सकते हैं और चीजें अपने पैरों के नीचे नहीं बदला जा सकता है। उदाहरण के लिए buffered पाठक को दिया गया फ़ाइल रीडर केवल उस buffered पाठक द्वारा संचालित किया जाना चाहिए। यदि कोई अन्य स्थान था जो इसे प्रभावित कर सकता था तो आपके पास असंगत ऑपरेशन हो सकता था क्योंकि एक पाठक ने फ़ाइल रीडर में अपनी स्थिति को उन्नत किया था, जबकि दूसरा यह वही रहना चाहता था, अब आप अन्य पाठक का उपयोग करें और यह एक अनिश्चित स्थान पर है।


निशान / रीसेट के बारे में:

BufferedReader में मार्क विधि एक readAheadLimit पैरामीटर लेता है जो रीसेट होने से पहले एक चिह्न के बाद आप कितनी दूर पढ़ सकते हैं, यह असंभव हो जाता है। रीसेटिंग का मतलब वास्तव में एक फ़ाइल सिस्टम (0) नहीं है, यह सिर्फ बफर के अंदर खोजता है। जावाडोक उद्धृत करने के लिए:

readAheadLimit - निशान को संरक्षित करते समय पढ़ने वाले वर्णों की संख्या पर सीमाएं। इस कई पात्रों को पढ़ने के बाद, स्ट्रीम को रीसेट करने का प्रयास विफल हो सकता है। इनपुट बफर के आकार की तुलना में बड़ा सीमा मान एक नया बफर आवंटित किया जाएगा जिसका आकार सीमा से छोटा नहीं है। इसलिए देखभाल के साथ बड़े मूल्यों का उपयोग किया जाना चाहिए।


शीर्ष से पढ़ने के लिए बस एक नया BufferedReader बनाने का नुकसान क्या है? मैं अपेक्षा करता हूं कि ऑपरेटिंग सिस्टम फ़ाइल को कैश करे क्योंकि यह काफी छोटा है।

यदि आप प्रदर्शन के बारे में चिंतित हैं, तो क्या आपने इसे बाधा साबित कर दिया है? मैं बस सबसे सरल चीज करता हूं और इसके बारे में चिंता न करें जब तक आपके पास कोई विशिष्ट कारण न हो। मेरा मतलब है, आप पूरी चीज को स्मृति में पढ़ सकते हैं और फिर परिणाम पर दो पास कर सकते हैं, लेकिन फिर से यह एक नए पाठक के साथ फिर से शुरू से पढ़ने से ज्यादा जटिल हो जाएगा।






bufferedinputstream