Java.io.PrintWriter और java.io.BufferedWriter के बीच अंतर?


94

कृपया नीचे दिए गए कोड को देखें:

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

इन दोनों विधियों में क्या अंतर है?

हमें बफ़र-वेटर पर PrintWriter का उपयोग कब करना चाहिए?

जवाबों:


61

BufferedWriter और PrintWriter के लिए एपीआई संदर्भ मतभेदों का विस्तार करते हैं।

PrintWriter का उपयोग करने का मुख्य कारण Println () जैसे प्रिंटएक्सएक्सएक्सएक्स तरीकों तक पहुंच प्राप्त करना है। आप अनिवार्य रूप से एक PrintWriter का उपयोग किसी फ़ाइल में लिखने के लिए कर सकते हैं जैसे आप कंसोल पर लिखने के लिए System.out का उपयोग करेंगे।

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

"PrintReader" जैसी कोई अवधारणा नहीं है; निकटतम आपको शायद java.util.Scanner है


4
@TritonMan कुछ बिंदु पर यह ओएस के साथ बातचीत करने की जरूरत है, जिसका अर्थ है जावा के बाहर कदम रखना।
टोफूबीर

89

PrintWriterअधिक विधियाँ देता है ( println), लेकिन सबसे महत्वपूर्ण (और चिंताजनक) अंतर यह है कि यह अपवादों को निगल जाता है

आप checkErrorबाद में यह देखने के लिए कॉल कर सकते हैं कि क्या कोई त्रुटि हुई है, लेकिन आमतौर पर आप PrintWriterकंसोल लिखने के लिए उपयोग करेंगे - या "त्वरित 'गंदे" ऐप्स में जहां आप अपवादों से परेशान नहीं होना चाहते (और जहां दीर्घकालिक विश्वसनीयता एक मुद्दा नहीं है)।

मुझे यकीन नहीं है कि "अतिरिक्त स्वरूपण क्षमताओं" और "अपवादों को न निगलें" पहलुओं को एक ही वर्ग में बांधा गया है - स्वरूपण स्पष्ट रूप से कई जगहों पर उपयोगी है जहां आप अपवाद नहीं चाहते हैं। यह देखना अच्छा होगा कि BufferedWriterकुछ बिंदुओं पर समान क्षमताएं प्राप्त होंगी ...


@IndyFields: नहीं, PrintStreamएक है OutputStreamPrintWriterएक है Writer
जॉन स्कीट

धन्यवाद। "यह अपवादों को निगलता है।" क्या आपका मतलब है कि PrintWriter चेक किए गए अपवादों को नहीं बढ़ाता है? कैसे के बारे में अनियंत्रित excepitons?

@ बान: मैं विशेष रूप से बात कर रहा था IOException, इसमें हर दूसरे आईओ अमूर्त ( Reader, Writerआदि) घोषणा करते हैं कि IOExceptionअगर कुछ गलत हो जाता है तो इसके तरीके फेंक देते हैं - PrintWriterनहीं।
जॉन स्कीट

8

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

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));

2
@Jons को याद करते हुए टिप्पणी करें कि PrintWriter अपवादों को निगल जाएगा। checkError को बुलाया जाना चाहिए।
मडमुर्फ

1
मैं रॉयल Tenenbaums प्यार करता था
ogen

4
कम से कम वर्तमान OpenJDK 8 कार्यान्वयन (और शायद पुराने संस्करण) में, PrinterWriterपहले से ही एक बनाता है BufferedWriter
निमरोडम

7

PrintWriter बस किसी भी राइटर पर प्रिंट मोड को वर्ण मोड में उजागर करता है।

बफ़र किए गए तरीके के अनुसार बफ़रड्राइवर अधिक कुशल है। और यह आपके सिस्टम प्लेटफ़ॉर्म के आधार पर, एक नई लाईन () विधि के साथ आता है, पाठ फ़ाइलों को सही ढंग से हेरफेर करने के लिए।

बफ़रेड्रेडर वर्णों में परिवर्तित बाइट्स के साथ, फ़ाइल से एक पाठ पढ़ने की अनुमति देता है। यह लाइन से लाइन पढ़ने की अनुमति देता है।

कोई PrintReader नहीं है, आपको अपने इनपुट के प्रारूप के अनुसार एक और रीडर कार्यान्वयन चुनना होगा।


3

PrintWriterकिसी फ़ाइल में कैरेक्टर डेटा लिखने के लिए सबसे बढ़ा हुआ लेखक है।

FileWriter और BufferedWriter पर PrintWriter का मुख्य लाभ है:

  1. PrintWriter फ़ाइल के साथ सीधे संवाद कर सकता है, और कुछ राइटर ऑब्जेक्ट के माध्यम से भी संचार कर सकता है।

PrintWriter printwriter = new PrintWriter("blah.txt");

(या)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. हम किसी भी प्रकार के आदिम डेटा को सीधे फ़ाइल में लिख सकते हैं (क्योंकि हमारे पास PrintWriter तरीकों के अतिरिक्त अधिभार संस्करण हैं, जैसे प्रिंट () और println ())।

    printwriter.print(65); //65
    bufferedwriter.write(65); //A
    printwriter.println(true); //true


2

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

नोट: कोड ब्लॉक में पाठ सामग्री स्वचालित रूप से शब्द-लिपटे है

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

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


0

BufferedWriter - एक आउटपुट कैरेक्टर स्ट्रीम पर टेक्स्ट लिखता है, कैरेक्टर स्ट्रीम से कैरेक्टर बफर करता है। PrintWriter - प्रिंट्स एक टेक्स्ट आउटपुट स्ट्रीम में ऑब्जेक्ट्स का निरूपण करता है।


-1

मुझे लगता है कि PrintWriter का उपयोग करने के पीछे का कारण पहले से ही ऊपर उल्लेखित है, लेकिन एक महत्वपूर्ण कारण है कि आप सीधे PrintWriter कंस्ट्रक्टर के पास एक फ़ाइल ऑब्जेक्ट पास करते हैं जो इसे उपयोग करना आसान बनाता है।

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.