2011-04-23 12 views
26

InputStream और InputStreamReader के बीच का अंतर यह है कि InputStreambyte के रूप में पढ़ता है, जबकि InputStreamReaderchar के रूप में पढ़ता है। उदाहरण के लिए, यदि फ़ाइल में टेक्स्ट abc है, तो दोनों ठीक काम करते हैं। लेकिन अगर पाठ a你们 है, जो a और दो चीनी वर्णों से बना है, तो InputStream काम नहीं करता है।बहु-बाइट वर्ण पढ़ने के दौरान इनपुटस्ट्रीम और इनपुटस्ट्रीम रीडर के बीच का अंतर

तो हमें InputStreamReader का उपयोग करना चाहिए, लेकिन मेरा प्रश्न है:

InputStreamReader कैरेक्टर को कैसे पहचानता है?

a एक बाइट है, लेकिन एक चीनी चरित्र दो बाइट्स है। क्या यह a को एक बाइट के रूप में पढ़ता है और वर्णों के दूसरे को दो बाइट्स के रूप में पहचानता है, या इस पाठ में प्रत्येक चरित्र के लिए, InputStreamReader इसे दो बाइट्स के रूप में पढ़ता है?

उत्तर

23

एक InputStream कच्चे ओकटेट (8 बिट) डेटा पढ़ता है:

यह लिंक एनकोडिंग का एक अच्छा व्याख्या है। जावा में, byte प्रकार char के बराबर है सी सी में टाइप करें, इस प्रकार का उपयोग चरित्र डेटा या बाइनरी डेटा का प्रतिनिधित्व करने के लिए किया जा सकता है। जावा में, char सी wchar_t प्रकार के साथ अधिक समानताएं साझा करता है।

एक InputStreamReader तो UTF-16 में कुछ एन्कोडिंग से डेटा को बदलने होंगे। यदि "एक 你们" डिस्क पर यूटीएफ -8 के रूप में एन्कोड किया गया है, तो यह बाइट अनुक्रम 61 E4 BD A0 E4 BB AC होगा। जब आप UTF-8 एन्कोडिंग के साथ InputStreamReader करने के लिए InputStream गुजरती हैं, यह चार अनुक्रम 0061 4F60 4EEC के रूप में पढ़ा जाएगा।

जावा में वर्ण एन्कोडिंग एपीआई इस बदलाव को करने के लिए एल्गोरिथम नहीं है। आप ओरेकल जेआरई here द्वारा समर्थित एन्कोडिंग की एक सूची पा सकते हैं। ICU project शुरू करने के लिए एक अच्छी जगह है यदि आप इंटरेल्स को समझना चाहते हैं कि यह अभ्यास में कैसे काम करता है।

अलेक्जेंडर पोग्रेबनिक points out के रूप में, आपको लगभग हमेशा एन्कोडिंग प्रदान करना चाहिए। byte -to- char तरीकों कि एनकोडिंग निर्दिष्ट नहीं है JRE default, जो ऑपरेटिंग सिस्टम और उपयोगकर्ता सेटिंग्स पर निर्भर है पर निर्भर हैं।

10

आप पाठक एक संकेत देने के लिए, एक चरित्र सेट है कि अपने बाइनरी फ़ाइल में लिखा है प्रदान करके किया है। उदाहरण के लिए

Reader reader = 
    new InputStreamReader(
     new FileInputStream("/path/to/file"), 
     "UTF-8" // most likely that the encoding of the file 
    ) 

एक संकेत के बिना यह अपने मंच डिफ़ॉल्ट एन्कोडिंग है, जो कई मामलों में नहीं है का उपयोग करेगा आपको क्या चाहिए। http://www.joelonsoftware.com/articles/Unicode.html

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