2012-08-24 13 views
11

मैं मौजूदा BufferedReader की एक नई प्रति बनाने के लिए BufferedReader कन्स्ट्रक्टर का उपयोग कर रहा हूं।मैं बुफर्ड रीडर की एक प्रति कैसे बना सकता हूं?

BufferedReader buffReader = new BufferedReader(originalBuffReader); 

नई buffReader ठीक काम कर रहा है, लेकिन जब मैं originalBuffReader.readLine() कर यह मेरे null देता है। क्या कोई अन्य तरीका है कि मैं अपने मूल BufferedReader को प्रभावित किए बिना एक नया bufferReader बना सकता हूं।

एफवाईआई: मुझे अपनी विधि में इनपुट के रूप में बफर रीडर मिल रहा है; और मेरे पास स्रोत तक पहुंच नहीं है।

+0

'बुफर्ड रीडर की प्रति' से आपका क्या मतलब है? क्या आप किसी भी तरह से एक ही स्ट्रीम को दो बार पढ़ने में सक्षम होने की उम्मीद कर रहे हैं? यह मुमकिन नहीं है। वास्तव में यह शब्दों में एक विरोधाभास है। – EJP

उत्तर

16

किसी भी अन्य तरह से मैं अपने oroginal BufferReader

बस दो BufferedReader रों बनाकर इसका हल के लिए कोई सीधे आगे रास्ता नहीं है को प्रभावित किए बिना एक नया bufferReader बना सकते हैं। (दो पाठक एक ही स्रोत से डेटा का उपभोग करेंगे।) आपको स्रोत पर बफरिंग का एक और स्तर जोड़ना होगा, इसलिए प्रत्येक पाठक स्ट्रीम को स्वतंत्र रूप से पढ़ सकता है।

import java.io.*; 
import org.apache.commons.io.input.TeeInputStream; 
class Test { 
    public static void main(String[] args) throws IOException { 

     // Create the source input stream. 
     InputStream is = new FileInputStream("filename.txt"); 

     // Create a piped input stream for one of the readers. 
     PipedInputStream in = new PipedInputStream(); 

     // Create a tee-splitter for the other reader. 
     TeeInputStream tee = new TeeInputStream(is, new PipedOutputStream(in)); 

     // Create the two buffered readers. 
     BufferedReader br1 = new BufferedReader(new InputStreamReader(tee)); 
     BufferedReader br2 = new BufferedReader(new InputStreamReader(in)); 

     // Do some interleaved reads from them. 
     System.out.println("One line from br1:"); 
     System.out.println(br1.readLine()); 
     System.out.println(); 

     System.out.println("Two lines from br2:"); 
     System.out.println(br2.readLine()); 
     System.out.println(br2.readLine()); 
     System.out.println(); 

     System.out.println("One line from br1:"); 
     System.out.println(br1.readLine()); 
     System.out.println(); 
    } 
} 

आउटपुट::

One line from br1: 
Line1: Lorem ipsum dolor sit amet,  <-- reading from start 

Two lines from br2: 
Line1: Lorem ipsum dolor sit amet,  <-- reading from start 
Line2: consectetur adipisicing elit, 

One line from br1: 
Line2: consectetur adipisicing elit, <-- resumes on line 2 
+0

आपके उत्तर के लिए धन्यवाद एओबोब, वास्तव में मुझे अपने मेथोड में इनपुट के रूप में एक बफर रीडर मिल रहा है, इसलिए मुझे उस बफर का उपयोग करके प्रतिलिपि बनाना है रीडर को स्रोत तक पहुंच नहीं है। – Sunil

+0

फिर मैं एक रैपर तैयार करता हूं जो दिए गए बफर किए गए पाठक को लपेटता है, पढ़ने वाली रेखाओं को बफर करता है और बफर से पढ़े जाने वाले माध्यमिक पाठकों को सौदा करता है। (जब तक आपके पास डेटा को पूरी तरह से सूची में निकालने का विकल्प नहीं है और इसके बजाय इसका उपयोग करें।) (मुझे उत्सुकता है, कौन सी एपीआई आपको केवल बुफर्ड रीडर देता है?) – aioobe

+1

बफर रीडर कहीं से स्रोत से भरा हुआ है और एक विधि से गुजर चुका है एक पैरामीटर के रूप में और मुझे इसे वहां से ले जाना है। – Sunil

2

एक के लिए निर्माता में एक BufferedReader उदाहरण में पासिंग

यह इस प्रकार है अपाचे कॉमन्स से TeeInputStream और एक PipedInputStream और PipedOutputStream के संयोजन के द्वारा प्राप्त किया जा सकता नया BufferedReader मूल BufferedReader की एक प्रति नहीं बनायेगा!

आप जो कर रहे हैं वह दो पाठक को चेन कर रहा है, दूसरे शब्दों में, आप पहले से ही बफर किए गए पाठक उदाहरण को बफर कर रहे हैं। जब आप readLine() पर buffReader पर कॉल करते हैं, तो यह originalBuffReader पर readLine() पर कॉल करेगा।

धाराओं की श्रंखला की अधिक जानकारी के लिए यहां एक नज़र डालें: Chaining of Streams

0

नीचे एक तरह से मूल BufferedReader से बाहर एक नया BufferedReader बनाने पर विचार कर रहा है।

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

ध्यान में रखना एक बात यह है कि आप डीडीओएस हमलों से रक्षा करना चाहते हैं, जहां एक बहुत बड़ा buffered पाठक आ सकता है और आप हमेशा के लिए पढ़ने और स्मृति को भरने से बचना चाहते हैं, आप मूल रूप से इसके लिए तोड़ सकते हैं कुछ बिंदु के बाद लूप या जब एक निश्चित स्थिति पूरी हो जाती है।

final String originalBufferedReaderDump; 
originalBufferedReaderDump.mark(Integer.MAX_VALUE); 
for (String line; (line = originalBufferedReader.readLine()) != null; originalBufferedReaderDump+= line); 
originalBufferedReader.reset(); 
final BufferedReader copiedBufferedReader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(originalBufferedReaderDump.getBytes())));