2010-05-12 16 views
112

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

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

+1

+1 अच्छा सवाल, मैं इन दो वर्गों को भी मिलाता हूं, और एपीआई दस्तावेज़ बहुत मदद नहीं करता है। – helpermethod

+0

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

उत्तर

117

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

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

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

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

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

+2

यही मैंने सोचा - लेकिन यह सच नहीं है। यहां तक ​​कि प्रिंटस्ट्रीम भी हुड के नीचे एक लेखक को बनाए रखता है - यदि आप इसे आउटपुटस्ट्रीम पास करते हैं, तो यह इसे लपेटता है। –

+2

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

+0

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

3

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

+1

प्रिंटस्ट्रीम को छोड़कर, क्योंकि वह एक एन्कोडिंग लेता है ताकि यह मानक आउटपुटस्ट्रीम से थोड़ा अधिक संभाल सके। –

+0

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

+0

"लेखक आपके लिए चरित्र सेट सामग्री को संभालते हैं" - केवल वे लेखक जो वर्णों को बाइट्स में परिवर्तित करने के साथ सौदा करते हैं। सभी लेखक नहीं करते हैं। – Aivar

2

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

+0

प्रिंटस्ट्रीम के साथ एक एन्कोडिंग के साथ-साथ – Aivar

58

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

PrintStream stream = new PrintStream(output); 
PrintWriter साथ

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

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

लाभ यह है कि आप चरित्र वर्ण एन्कोडिंग ऐसे में लिखा जाना चाहिए कि वे अंततः mojibake के रूप में नहीं करना पड़ेगा नियंत्रित कर सकते हैं, अच्छी तरह से,।

+38

+1 मुझे एक नया शब्द, मोजीबैक पढ़ाने के लिए निर्दिष्ट कर सकता है :) – Jonik

+7

1 से।4, प्रिंटस्ट्रीम के लिए एक नया कन्स्ट्रक्टर है जो एन्कोडिंग 'प्रिंटस्ट्रीम (आउटपुटस्ट्रीम आउट, बूलियन ऑटोफ्लश, स्ट्रिंग एन्कोडिंग)' – artbristol

+0

धन्यवाद लेता है! - मैं एक विशिष्ट एन्कोडिंग के साथ एक बाइट सरणी को मुद्रित करने का एक तरीका ढूंढ रहा था। –

17

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

-1

प्रिंटराइटर प्रिंटस्ट्रीम का एक संवर्द्धन है।

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

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