2012-03-10 20 views
36

के बीच विशिष्ट अंतर मैं BufferedReader और FileReader के बीच विशिष्ट अंतर पता करना चाहते हैं।bufferedreader और FileReader

मुझे पता है कि BufferedReaderFileReader के विपरीत अधिक कुशल है, लेकिन क्या कोई यह बता सकता है कि क्यों (विशेष रूप से और विस्तार से)? धन्यवाद।

उत्तर

66

सरल तरीके में:

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

बहुत विस्तार से

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

enter image description here

उत्पादन के साथ के रूप में, यह दक्षता में सुधार करने के लिए एक बफर का उपयोग करने के अच्छी आदत है। इसके लिए BufferedReader का प्रयोग करें। यह वही कक्षा है जिसे हम कीबोर्ड इनपुट के लिए उपयोग कर रहे हैं। ये लाइनें परिचित दिखना चाहिए:

BufferedReader stdin = 
    new BufferedReader(new InputStreamReader(System.in)); 

ये लाइनें एक BufferedReader बनाने के लिए, लेकिन कीबोर्ड से एक इनपुट धारा से कनेक्ट, एक फाइल करने के लिए नहीं।

स्रोत: http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html

-2

Bufferedreader - विधि को आप स्कैनर विधि के लिए एक विकल्प के रूप में वास्तव में उपयोग कर सकते हैं,, फ़ाइल हो जाता है इनपुट हो जाता है।

FileReader - जैसा कि नाम से पता चलता है।

-1

FileReader - पढ़ने के चरित्र फ़ाइलों

BufferedReader - "।, एक चरित्र इनपुट धारा से पाठ पढ़ें पात्रों बफरिंग इतनी के रूप में वर्ण, सरणियों, और लाइनों के कुशल पढ़ने के लिए प्रदान करने के लिए"

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

http://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html

असल BufferedReader FileReader तरह पाठकों का उपयोग करता है।

0

BufferedReader एक रीडर, जिनमें से एक है FileReader की आवश्यकता है - यह InputStreamReader, जो रीडर से उतरता से उतरता है।

-1

फ़ाइल रीडर वर्ग फ़ाइल पर लिखने में मदद करता है लेकिन इसकी प्रभाव कम है क्योंकि यह फ़ाइल से एक समय में एक चरित्र को पुनः प्राप्त करता है लेकिन BufferedReader डेटा के हिस्सों को लेता है और इसे बफर में संग्रहीत करता है ताकि फ़ाइल के आगमन से एनीम पर एक चरित्र को पुनः प्राप्त करने की बजाय बफर का उपयोग करना आसान हो जाता है।

63

सबसे पहले, आपको जावा में स्ट्रीमिंग समझनी चाहिए क्योंकि जावा में सभी "पाठक" उस अवधारणा पर बनाए गए हैं।

फ़ाइल स्ट्रीमिंग

फ़ाइल स्ट्रीमिंग जावा में FileInputStream वस्तु द्वारा किया जाता है।

// it reads one byte at a time and stores into the 'byt' variable 
int byt; 
while((byt = fileInputStream.read()) != -1) { 
    fileOutputStream.write(byt); 
} 

यह ऑब्जेक्ट वास्तव में एक समय में एक बाइट (8-बिट्स) पढ़ता है और इसे दी गई फ़ाइल में लिखता है।

एक व्यावहारिक अनुप्रयोग होगा, जब आप कच्चे बाइनरी/डेटा फ़ाइलों जैसे छवियों या ऑडियो फ़ाइलों के साथ काम करेंगे (ऑडियो फ़ाइलों के लिए FileInputStream के बजाय AudioInputStream का उपयोग करें)। दूसरी ओर टेक्स्ट फ़ाइलों के लिए, यह बहुत ही असुविधाजनक और धीमी है, क्योंकि एक समय में बाइट के माध्यम से लूपिंग, फिर कुछ प्रसंस्करण और बाइट बैक स्टोर करना कठिन और समय लेने वाला है।

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

फ़ाइल पढ़ना

यह सिर्फ चरित्र सेट समर्थन के साथ "फाइल स्ट्रीमिंग" कह का एक आधुनिक तरीका है।

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

तो जावा लोग पाठ फ़ाइलों के साथ विशेष रूप से निपटने के लिए, FileReader वर्ग गयी। यह एक बार में 2 बाइट्स पढ़ता (FileInputStream के ऊपर एक विशाल सुधार !! मैं कहना चाहता हूँ अभी भी बेहतर विकल्प तो एक बाइट स्ट्रीमिंग।)

तो आपरेशन के रूप में है,

int c; 
while ((c = fileReader.read()) != -1) { // some logic } 

कृपया ध्यान दें , दोनों उदाहरण इनपुट फ़ाइल से प्राप्त मूल्य को संग्रहीत करने के लिए एक पूर्णांक चर का उपयोग करते हैं।

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

लेकिन फिर भी यह अभी भी धीमा है (एक बार 2 बाइट पढ़ने और इसके माध्यम से लूपिंग इमेजिंग!)।

बफरिंग धाराओं

एक बाइट या 2. जावा लोग एक उल्लेखनीय कार्यात्मकता जोड़ पर निरंतर पाशन की समस्या हल करने के लिए। "प्रक्रिया से पहले, एक बफर बनाने के लिए।"

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

उसी तकनीक का BufferedReader वर्ग द्वारा प्रयोग किया जाता है, BufferedReader वस्तु FileReader वस्तु जो पाठ फ़ाइल को पढ़ने की जरूरत है के बारे में सभी जानकारी शामिल है।

लेता है

बफर रीडर ऑब्जेक्ट फ़ाइलreader ऑब्जेक्ट को दिए गए टेक्स्ट फ़ाइल को पढ़ने के लिए उपयोग करता है। प्रत्येक बार फ़ाइल रीडर टेक्स्ट फ़ाइल से 2 बाइट पढ़ता है, यह डेटा बफर रीडर ऑब्जेक्ट पर देता है। अब, बफर रीडर ऑब्जेक्ट भी "बफर" नामक एक विशेष मेमोरी जगह बनाता है, और वहां सभी बफर किए गए डेटा स्टोर करता है।

BufferedReader br = new BufferedReader(new FileReader("example.txt")); 

2 बाइट्स एक समय पढ़ने की प्रक्रिया, FileReader वस्तु हिट जब तक दोहरा रहता है, '\ n', '\ r n \' (एक नई लाइन चरित्र), और BufferReader बंद हो जाता है बफरिंग । अगली पंक्ति को पढ़ने के लिए निर्देश (जब तक अगली पंक्ति बफर करने के लिए) दिया जाता है।

// this variable points to the buffered line 
String line; 

// Keep buffering the lines and print it. 
while ((line = br.readLine()) != null) { 
    printWriter.println(line); 
} 

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

लेकिन फिर, हमें फ़ाइलरडर ऑब्जेक्ट को बफररडर को पास करने की आवश्यकता क्यों है? क्या हम सिर्फ "इस फ़ाइल को बफर नहीं कर सकते" और यह करता है, क्या वह मीठा और छोटा नहीं होगा?

तरह से यह काम करता है यह, BufferReader वर्ग एक गूंगा वर्ग कितना बफ़र होना जानता है, जो है, ऐसा करने से बफ़र या यह सिर्फ परवाह नहीं करता कि क्या बारे में एक सुराग नहीं है। तो कहा जा रहा है कि, जब आप FileReader प्रदान करते हैं यह एक फ़ाइल, उसी तरह बफ़र्स अगर आप जैसे InputStreamReader की एक वस्तु प्रदान करते हैं

// Object that reads console inputs 
InputStreamReader console = new InputStreamReader(System.in); 
BufferedReader br = new BufferedReader(console); 
System.out.println(br.readLine()); 

जब तक यह हिट यह टर्मिनल/कंसोल इनपुट डेटा को स्कैन करेगा एक नया लाइन प्रतीक, और स्कैन की गई पंक्ति को बफर में संग्रहीत करता है।

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

bufferedReader.readLine(); 

जो भी आप बफरिंग कर रहे हैं उसे मुद्रित करने के लिए।

+4

ग्रेट स्पष्टीकरण! – JavaDeveloper

+1

धन्यवाद! मैं बस कुछ जटिल अवधारणाओं को समझाने की कोशिश कर रहा था! :) –

+0

वास्तव में अच्छा स्पष्टीकरण, यह मेरे संदेहों को पूरी तरह से मंजूरी दे दी। :) –