2008-11-04 28 views
24

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

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

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

धन्यवाद टीजे

उत्तर

24

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

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

27

बुफर्ड पाठक क्रमशः फ़ाइल को पढ़ने के लिए हैं। आप जो खोज रहे हैं वह 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" एक विधा चरित्र जो detailed here है।

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

3

आगे बढ़ने का सबसे अच्छा तरीका है अपने एल्गोरिदम को बदलने के लिए, जिस तरीके से आपको दूसरे पास की आवश्यकता नहीं होगी। मैंने इस दृष्टिकोण का इस्तेमाल दो बार किया था, जब मुझे भारी (लेकिन भयानक नहीं, यानी कुछ जीबी) फाइलें थीं जो उपलब्ध स्मृति में फिट नहीं थीं।

यह कठिन हो सकता है, लेकिन प्रदर्शन लाभ आम तौर पर

+0

क्या आप विस्तृत कर सकते हैं? मेरे पास एक फ़ाइल है जो 30 एमबी बड़ी है, मैं इसे सब कुछ स्मृति में लोड नहीं कर सकता। मैंने डेटा को सॉर्ट किया है, और अब फ़ाइल पर सीधे बाइनरी खोज करना है। इसके लिए मुझे यादृच्छिक रूप से खोजना होगा। –

+0

आजकल मुझे लगता है कि आप वास्तव में छोटे-एम्बेडेड एचडब्ल्यू का उपयोग कर रहे हैं (लेकिन फिर यह डिस्कलेस होगा) वैसे भी, डिस्क पर यादृच्छिक खोज अक्सर बाइनरी खोज के लॉगरिदमिक प्रदर्शन को पूरी तरह से बर्बाद कर देती है। कुछ विकल्प हैं 1) अनुक्रमिक पहुंच (हां, डिस्क पर अनुक्रमिक खोज बाइनरी खोज से तेज हो सकती है) या 2) एक मिश्रित दृष्टिकोण जैसे कि बी-पेड़ http://en.wikipedia.org/wiki/ बी-पेड़ यदि ये संकेत पर्याप्त नहीं हैं तो आप टिप्पणी के बजाए अपना प्रश्न एक अलग के रूप में पेश करना चाहेंगे (कृपया, मुझे पिंग करने के लिए प्रश्न के लिंक के साथ यहां एक टिप्पणी पोस्ट करें) – Davide

-1

प्रयास worths ") चिह्न (के बारे में पूरे व्यापार और रीसेट() BufferedReader गरीब डिजाइन की बू आती है।"

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

बीआर,
~ एक

1

मार्क के बारे में/रीसेट:

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

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

संबंधित मुद्दे