2013-02-26 140 views
8

शीर्षक सुंदर आत्म-व्याख्यात्मक है। जेआरई javadocs के बहुत सारे में मैं वाक्यांशों को बाइट्स "और" अक्षरों की धारा "स्ट्रीम पर वाक्यांशों को देखता हूं।जावा - वर्णों के बनाम बनाम धारा की स्ट्रीम?

लेकिन क्या वे वही बात नहीं हैं? या जावा-भूमि में वे थोड़ा अलग हैं (उदाहरण के लिए अलग-अलग व्याख्या किए गए हैं)? अग्रिम में धन्यवाद।

उत्तर

15

जावा में, एक byte एक char रूप में एक ही बात नहीं है। इसलिए एक बाइट स्ट्रीम एक चरित्र धारा से अलग है। बाइट्स मनमाना बाइनरी डेटा के लिए हैं; पात्र विशेष रूप से तारों के निर्माण खंडों का प्रतिनिधित्व करने वाले डेटा के लिए होते हैं।

लेकिन यह नहीं है अगर एक चार कि छोड़कर चौड़ाई

में केवल 1 बाइट है। प्रति the JLS §4.2.1 एक char के रूप में श्रृंखला में एक नंबर है:

'\u0000' से '\uffff' को

समावेशी, कि 0 से 65535

करने के लिए, है लेकिन एक byte रेंज में एक नंबर है

-128 से 127 तक, समावेशी

+1

धन्यवाद @ मैट बॉल - मैं समझता हूं कि वे अलग-अलग प्रकार के होते हैं ('बाइट', 'char', आदि), लेकिन यदि' char' चौड़ाई में केवल 1 बाइट है, तो एक स्टोर करने के बारे में क्या अलग है एक इनपुट बाइट सरणी बनाम चार सरणी के रूप में इनपुट स्ट्रीम? वह मेरे प्रश्न की जड़ पर था। – IAmYourFaja

+4

कौन कहता है कि 'char' चौड़ाई में केवल 1 बाइट है? http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html –

4

वे अलग हैं। Character और char जावा में 2-बाइट डेटाटाइप हैं। Byte और byte 1-बाइट डेटाटाइप हैं।

संपादित करें: char भी एक हस्ताक्षरित प्रकार है, जबकि byte नहीं है।

3

बाइट का प्रवाह केवल सादा बाइट है, जैसे कि जब आप हेक्स संपादक में फ़ाइल खोलते हैं तो आप इसे कैसे देखेंगे।

कैरेक्टर केवल सादा बाइट से अलग है। ASCII एन्कोडिंग प्रति चरित्र बिल्कुल 1 बाइट का उपयोग करता है, लेकिन यह कई अन्य एन्कोडिंग के लिए सच नहीं है। उदाहरण के लिए, UTF-8 encoding एक वर्ण को एन्कोड करने के लिए 1 से 6 बाइट्स का उपयोग कर सकता है। चरित्र की धारा अंतर्निहित एन्कोडिंग को दूर करने के लिए डिज़ाइन की गई है, और char एक प्रकार के एन्कोडिंग (जावा, char और String यूटीएफ -16 एन्कोडिंग का उपयोग करती है) का उत्पादन करती है।

अंगूठे का एक नियम के रूप में:

  • जब आप पाठ के साथ काम कर रहे हैं, आप उचित एन्कोडिंग के साथ चरित्र में बाइट डिकोड करने के लिए चरित्र की धारा का उपयोग करना चाहिए।

  • जब आप बाइनरी डेटा या बाइनरी और टेक्स्ट के मिश्रित होते हैं, तो आपको बाइट की धारा का उपयोग करना चाहिए, क्योंकि यह अन्यथा समझ में नहीं आता है। यदि बाइट का अनुक्रम कुछ एन्कोडिंग में स्ट्रिंग का प्रतिनिधित्व करता है, तो आप स्ट्रिंग को वापस पाने के लिए हमेशा उन बाइट्स को चुन सकते हैं और String(byte[] bytes, Charset charset) कन्स्ट्रक्टर का उपयोग कर सकते हैं।

0

आम तौर पर उनके आकार के संदर्भ में धाराओं के बारे में बात करना बेहतर होता है, जो वे लेते हैं। बाइट्स की धारा वर्णों की धाराओं की तुलना में अधिक सहज है, क्योंकि वर्णों की धाराओं को हमें दो बार जांचना पड़ता है कि एक char वास्तव में एक बाइट है, न कि यूनिकोड चार, या कुछ भी फैंसी।

एक चार एक प्रतिनिधित्व है, जिसे बाइट द्वारा दर्शाया जा सकता है, लेकिन एक बाइट हमेशा बाइट होने जा रहा है। जब बाइट 8 बिट्स बंद हो जाएंगे तो सारी दुनिया जल जाएगी।

+0

_ "बाइट्स 8 बिट्स होने पर बंद होने पर सभी दुनिया जला दी जाएगी।" _ मुश्किल से। http://en.wikipedia.org/wiki/Byte#History –

+0

http://stackoverflow.com/questions/13615764/is-a-byte-always-8- बिट्स – Dmitry