जावा: PrintStream और PrintWriter के बीच अंतर


125

बीच क्या अंतर है PrintStreamऔरPrintWriter ? उनके पास आम तौर पर कई विधियां हैं जिनके कारण मैं अक्सर इन दो वर्गों को मिलाता हूं। इसके अलावा, मुझे लगता है कि हम उनका उपयोग उसी चीजों के लिए कर सकते हैं। लेकिन एक अंतर होना चाहिए, अन्यथा, केवल एक वर्ग होता।

मैंने अभिलेखागार को खोजा है, लेकिन इस प्रश्न का पता नहीं लगा सका।


1
+1 अच्छा प्रश्न, मैं इन दो वर्गों को भी मिलाता हूँ, और एपीआई डॉक भी बहुत मदद नहीं करता है।
हेल्परमेथोड

एक और अंतर यह है कि ऑटोफ्लश कैसे काम करता है। एक लेखक के लिए आउटपुट में a \ n वर्ण की उपस्थिति फ्लश () होती है। लेकिन एक बाइट स्ट्रीम (प्रिंटस्ट्रीम) में केवल बाइट्स होता है। ऑटोफ्लश तब जावदॉक में वर्णित के रूप में काम करता है, इस आधार पर: "नए चरित्र के बजाय लाइन विभाजक की प्लेटफॉर्म की अपनी धारणा"।
मिनट

जवाबों:


129

यह स्पष्ट लग सकता है, लेकिन PrintStreamएक प्रिंट करता है OutputStream, और PrintWriterएक प्रिंट करता है Writer। ठीक है, मुझे संदेह है कि मुझे स्पष्ट बताने के लिए कोई अंक मिलेगा। लेकिन वहाँ अधिक है।

तो, OutputStreama और a के बीच क्या अंतर है Writer? दोनों धाराएँ हैं, प्राथमिक अंतर के साथ OutputStreamएक बाइट्स की एक धारा है, जबकि एक Writerवर्णों की एक धारा है।

यदि OutputStreamबाइट्स के साथ एक सौदा होता है, तो क्या होगा PrintStream.print(String)? यह डिफ़ॉल्ट प्लेटफ़ॉर्म एन्कोडिंग का उपयोग करके बाइट्स को बाइट्स में परिवर्तित करता है। डिफ़ॉल्ट एन्कोडिंग का उपयोग करना आम तौर पर एक बुरी बात है क्योंकि यह एक प्लेटफॉर्म से दूसरे प्लेटफॉर्म पर जाते समय बग पैदा कर सकता है, खासकर यदि आप एक प्लेटफॉर्म पर फाइल उत्पन्न कर रहे हैं और दूसरे पर इसका उपभोग कर रहे हैं।

के साथ Writer , आप आमतौर पर किसी भी प्लेटफ़ॉर्म निर्भरता से बचने के लिए एन्कोडिंग का उपयोग करने के लिए निर्दिष्ट करते हैं।

PrintStreamJDK में परेशान होने की बात क्यों , क्योंकि प्राथमिक इरादा पात्रों को लिखना है, और बाइट्स नहीं? PrintStreamजेडीके 1.1 से पहले जब रीडर / राइटर कैरेक्टर स्ट्रीम पेश किए गए थे। मैं कल्पना करता हूं कि PrintStreamअगर इस तथ्य का व्यापक रूप से उपयोग किया जाता है तो केवल सूर्य ही वंचित होता । (सब के बाद, आप नहीं प्रत्येक कॉल करने के लिए चाहते हो जाएगा System.outएक बहिष्कृत API चेतावनी उत्पन्न करने के लिए! इसके अलावा, से प्रकार बदलने PrintStreamके लिए PrintWriterमानक आउटपुट धाराओं मौजूदा अनुप्रयोगों भंग हो जाए पर।)


3
यही मैंने सोचा था - लेकिन यह सच नहीं है। यहां तक ​​कि PrintStream हुड के नीचे एक राइटर रखता है - यदि आप इसे एक OutputStream पास करते हैं, तो यह इसे लपेटता है।
जॉन स्कीट

3
@Jon - आंतरिक रूप से, एक राइटर है, लेकिन यह एक OutputStream को लिखता है, इसलिए शुद्ध प्रभाव यह है कि एक PrintStream एक OutputStream को लिखता है - char to byte रूपांतरण होता है, और डिफ़ॉल्ट प्लेटफ़ॉर्म एन्कोडिंग का उपयोग करता है। PrintWriter में char-> बाइट रूपांतरण के लिए ऐसी कोई आवश्यकता नहीं है, आप सभी तरह के पात्रों के साथ रह सकते हैं।
mdma

"डिफ़ॉल्ट चारसेट वर्चुअल-मशीन स्टार्टअप के दौरान निर्धारित किया जाता है और आमतौर पर लोकल और अंतर्निहित ऑपरेटिंग सिस्टम के चारसेट पर निर्भर करता है।"
पिंडतजुह

7
जावा 1.5 के बाद से, PrintStreamप्लेटफ़ॉर्म डिफ़ॉल्ट एन्कोडिंग का उपयोग करने के लिए सीमित नहीं किया गया है; ऐसे कंस्ट्रक्टर हैं जो एक चारसेट नाम स्वीकार करते हैं। इस प्रकार के बीच भेद PrintStreamऔर PrintWriterहै कि एक कर रहे हैं PrintWriterकच्चे बाइट्स नहीं लिख सकते हैं और दो वर्गों स्थलों के विभिन्न प्रकार लपेट दें।
टेड हॉप

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

61

साथ PrintStreamआप मंच के डिफ़ॉल्ट एन्कोडिंग के लिए अटक कर रहे हैं।

PrintStream stream = new PrintStream(output);

साथ PrintWriterआप फिर भी एक पारित कर सकते हैं OutputStreamWriterएक विशिष्ट एन्कोडिंग के साथ।

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

इसका लाभ यह है कि, आप चरित्र को नियंत्रित कर सकते हैं कि पात्रों को एन्कोडिंग इस तरह लिखा जाए कि वे अंत में समाप्त न हों मोजिबेक के होंगे


12
1.4 के बाद से, PrintStream के लिए एक नया कंस्ट्रक्टर है जो एन्कोडिंग लेता हैPrintStream(OutputStream out, boolean autoFlush, String encoding)
Artbristol

19

JDK 1.4 के बाद से PrintStream के लिए वर्ण एन्कोडिंग निर्दिष्ट करना संभव है। इस प्रकार, PrintStream और PrintWriter के बीच का अंतर केवल ऑटो फ्लशिंग व्यवहार के बारे में है और यह कि PrintStream एक Writer को लपेट नहीं सकता है।


3

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


1
PrintStream को छोड़कर, क्योंकि वह एन्कोडिंग लेता है इसलिए यह एक Standard OutputStream की तुलना में थोड़ा अधिक संभाल सकता है।
साइमन ग्रोएनवोल्ट

अजीब लगता है कि System.out, जो एकमात्र लक्ष्य स्ट्रिंग्स प्रिंट करना है, वास्तव में एक PrintStream है।
मिनट

"लेखक आपके लिए कैरेक्टर सेट सामान सेट करते हैं" - केवल राइटर्स जो अक्षरों को बाइट्स में बदलने से निपटते हैं। सभी राइटर्स नहीं करते हैं।
ऐवर

2

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


PrintStream से एन्कोडिंग को निर्दिष्ट किया जा सकता है
Aivar

1

से कोर जावा Horstmann द्वारा

जावा के दिग्गजों को आश्चर्य हो सकता है कि PrintStream वर्ग और System.out को जो कुछ भी हुआ। जावा 1.0 में, PrintStream वर्ग ने सभी यूनिकोड वर्णों को ASCII वर्णों में विभाजित करके शीर्ष बाइट को गिरा दिया। (उस समय, यूनिकोड अभी भी 16-बिट एन्कोडिंग था।) स्पष्ट रूप से, यह एक साफ या पोर्टेबल दृष्टिकोण नहीं था, और यह जावा 1.1 में पाठकों और लेखकों की शुरूआत के साथ तय किया गया था। मौजूदा कोड के साथ संगतता के लिए, System.in, System.out, और System.err अभी भी इनपुट / आउटपुट स्ट्रीम हैं, न कि पाठक और लेखक। लेकिन अब PrintStream क्लास आंतरिक रूप से यूनिकोड वर्णों को उसी तरह से डिफ़ॉल्ट होस्ट एन्कोडिंग में परिवर्तित करता है, जिस तरह से PrintWriter करता है। जब आप प्रिंट और प्रिंटलाइन विधियों का उपयोग करते हैं, तो टाइपस्ट्रीम की वस्तुएं प्रिंट लेखकों की तरह कार्य करती हैं,


-3

Printwriter प्रिंटस्ट्रीम की वृद्धि है।

IE एक विशिष्ट उद्देश्य के लिए प्रिंटस्ट्रीम।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.