java - एक पाठक को इनपुटस्ट्रीम और आउटपुटस्ट्रीम में एक लेखक को कैसे परिवर्तित करें?




stream (8)

WriterOutputStream का उपयोग करते समय एक चेतावनी - यह हमेशा एक फ़ाइल में उचित बाइनरी डेटा को नियमित रूप से / नियमित आउटपुट स्ट्रीम के रूप में संभालती नहीं है। मुझे इस बात का कोई मुद्दा था कि मुझे ट्रैक करने में थोड़ी देर लग गई।

यदि आप कर सकते हैं, तो मैं आपके बेस के रूप में आउटपुट स्ट्रीम का उपयोग करने की अनुशंसा करता हूं, और यदि आपको स्ट्रिंग्स लिखने की आवश्यकता है, तो इसे करने के लिए स्ट्रीम के चारों ओर एक OUtputStreamWriter wrapper का उपयोग करें। टेक्स्ट को बाइट्स को दूसरी तरफ से कनवर्ट करने के लिए कहीं अधिक विश्वसनीय है, यही कारण है कि WriterOutputStream मानक जावा लाइब्रेरी का हिस्सा नहीं है

क्या पाठ एन्कोडिंग समस्याओं से निपटने से बचने का कोई आसान तरीका है?



इन वर्गों के लिए स्पष्ट नाम ReaderInputStream और WriterOutputStream हैं। दुर्भाग्य से ये जावा पुस्तकालय में शामिल नहीं हैं। हालांकि, गूगल आपका दोस्त है।

मुझे यकीन नहीं है कि यह सभी टेक्स्ट एन्कोडिंग समस्याओं के आसपास जा रहा है, जो रात्रिभोज हैं।

एक आरएफई है, लेकिन यह बंद है, ठीक नहीं होगा।


उपयोग:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

रिपोर्ट के बड़े होने पर इस तरह से String लिए अपफ्रंट रूपांतरण की आवश्यकता नहीं होती है और फिर byte[] , जो बहुत अधिक ढेर मेमोरी आवंटित करती है। यह फ्लाई पर बाइट्स में बदल जाता है क्योंकि स्ट्रिंगबफर से सीधे स्ट्रीम पढ़ी जाती है।

यह अपाचे कॉमन्स आईओ प्रोजेक्ट से CharSequenceInputStream का उपयोग करता है।


क्या आप OutputStream Reader की सामग्री लिखने की कोशिश कर रहे हैं? यदि ऐसा है, तो OutputStream में OutputStream को लपेटने में आपके पास एक आसान समय होगा और पाठक को InputStream कनवर्ट करने की कोशिश करने के बजाय, Reader को Reader से लिखना होगा:

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block

खैर, एक पाठक वर्णों और बाइट्स के साथ एक इनपुटस्ट्रीम सौदों के साथ सौदा करता है। एन्कोडिंग निर्दिष्ट करता है कि आप बाइट्स के रूप में अपने पात्रों का प्रतिनिधित्व कैसे करना चाहते हैं, ताकि आप वास्तव में इस मुद्दे को अनदेखा नहीं कर सकें। समस्याओं से बचने के लिए, मेरी राय है: एक वर्णमाला (उदाहरण के लिए "यूटीएफ -8") चुनें और इसके साथ चिपके रहें।

वास्तव में इसे कैसे किया जाए, इस बारे में बताया गया है, " इन वर्गों के लिए स्पष्ट नाम रीडरइनपुटस्ट्रीम और राइटरऑटपुटस्ट्रीम हैं " आश्चर्य की बात है, " इन्हें जावा लाइब्रेरी में शामिल नहीं किया गया है " भले ही 'विपरीत' वर्ग, इनपुटस्ट्रीम रीडर और आउटपुटस्ट्रीमवाइटर शामिल थे।

इसलिए, अपाचे कॉमन्स आईओ सहित कई लोग अपने स्वयं के कार्यान्वयन के साथ आए हैं। लाइसेंसिंग मुद्दों के आधार पर, आप शायद अपने प्रोजेक्ट में कॉमन्स-आईओ लाइब्रेरी को शामिल करने में सक्षम होंगे, या यहां तक ​​कि स्रोत कोड के एक हिस्से की प्रतिलिपि भी लेंगे (जो here डाउनलोड करने योग्य here )।

जैसा कि आप देख सकते हैं, दोनों वर्गों के दस्तावेज बताते हैं कि "जेआरई द्वारा समर्थित सभी वर्णसेट एन्कोडिंग सही ढंग से संभाले जाते हैं"।

एनबी अन्य उत्तरों में से एक पर टिप्पणी issues.apache.org/bugzilla/show_bug.cgi?id=40455 का उल्लेख करती है। लेकिन यह Apache Ant ReaderInputStream क्लास ( here ) को प्रभावित करता है, अपाचे कॉमन्स IO ReaderInputStream क्लास नहीं।


यह भी ध्यान रखें कि, यदि आप स्ट्रिंग के साथ शुरू कर रहे हैं, तो आप स्ट्रिंग रीडर बनाने को छोड़ सकते हैं और org.apache.commons.io का उपयोग करके एक चरण में इनपुटस्ट्रीम बना सकते हैं। कॉमन्स आईओ से इस तरह की विशेषताएं:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

बेशक आपको अभी भी टेक्स्ट एन्कोडिंग के बारे में सोचना होगा, लेकिन कम से कम रूपांतरण एक चरण में हो रहा है।









stream