字節流、字符流、ascii、gb2312、gbk、gb18030、亂碼、什麼時候使用字節流,什麼時候使用字符流,二者區別

早先在 Java IO包裏面出現的都是字節流,因爲數據,無論是硬盤上的還是內存中的,都是字節,都是二進制數據10101的方式進行傳輸或保存的。

那麼爲什麼後來又出現了個字符流的概念呢?

在我們處理數據的時候,數據的種類有很多,比如dvd,圖片,文本,mp3等對於dvd,mp3等都是媒體數據,無論什麼數據都是二進制的,0101之類的方式存在的。所以無論什麼數據字節流都可以搞定。但是其中有一部分是文本數據,這個是比較常見和常用的,爲了方便處理這類數據。單獨分離出來個字符流,來處理這類特殊常用的數據類型。

單獨分離出來字符流,到底哪方便了呢?
字符流的由來:
(無證可考,我道聽途說的。)

想要在計算機裏面,識別我們日常生活中的一些數據。計算機是美國人發明的,美國人的生活當中,都是些字母,abcd。。。但是計算機只能識別010101,二進制數。那麼就用1010,這個排列組合和字母形成一個一一對應的映射表,比如:a的對應數字就97,等等很多對應關係。想到沒有,就是上學時候,說的就是ascii碼錶。有了這個表,計算機就可以識別美國人的字母和一些標點符號啦,然後,計算機到了中國,爲了讓計算也能夠認識中國的漢字,哎,我們就向美國人學習,也整出來一個表:漢字和1010對應的表,來對應中國的漢字。這張表叫做GB2312,這個表收錄了幾千個中文漢字和標點符號,但是中文博大精深,幾千個哪夠啊,所以後來又進行了一次擴容。擴容升級之後叫做GBK,上了兩萬多的內容,但是還是不夠用吧。後面就繼續擴容,想想上學時候,你用的新華字典。估計都搬進去啦。然後就有了GB18030,然後呢,上升到國際層面來上說。國際標準化組織就琢磨這事啦。這不行啊。一個國家整個表,這的整多少個碼錶呢。所以,他們覺得:哎,咱們一共就整一個表,把地球上能用的語言都整進來。然後就把各個國家的文字都給整進來,進行編排,用數字進行編排,弄了個國際性的碼錶,叫做unicode碼錶,然後,後期又進行了優化,然後這就是現在常用的utf-8碼錶的由來。

爲啥Unicode要升級爲utf-8呢?

Unicode裏面無論什麼字符,都必須用2個字節表示,一個字節8個二進制位,那麼每個都要用16位來表示一個字符,比如a,97,一個8位二進制就夠了,用2個浪費空間啦。後期的utf-8就對此做了優化:一個字節夠用就用一個,不夠用,用2個,還不夠,用3個,肯定夠了。漢字好像是2個字節,也就是佔16位。

亂碼的由來:

現在假設我用gbk的編碼方式,把“您”這個字給存到電腦上,存起來的數據都是二進制的格式喲,別忘記了哈,這個二進制的數字,是根據gbk這個碼錶來判斷的"您"對應的到底是數字幾假設是數字99吧,然後,寫到硬盤上。然後,你到另一臺電腦上,他的電腦上是utf-8的編碼格式,那麼在這個utf-8的碼錶上讀99對應的字符,那就不一定是漢字“您”了。所以亂碼就由此而產生了。 

爲了解決亂碼問題,Java出現了字符流。

Java在流技術上,在字節流的基礎上,出現了字符流。這個字符流出現的好處有什麼呢?他可以在內部融合編碼表,也就是說,你讀到的這個字節數據,你到底是查的哪個編碼表,到底是查gbk的碼錶,還是查utf-8碼錶,可以由我們自己來指定,這樣我們在處理文字的時候,就可以很方便。這個就是字符流的由來。

簡單一句話:字符流的這些對象裏面,融合了編碼表,只有文字適合編碼。


所以,字符流適合處理文字。假如當前我想處理圖片,那麼就用字節流來處理,爲什麼?總不至於,你把圖片的數據讀出來以後,在把數據進行編碼表查找,換成文字,一美女圖片,你查出來,變成一堆文字,這不合適吧。

通用的是字節流,字符流是基於字節流。


最後就是在Java的io體系裏面一共有四個抽象基類

字節流:InputStream和OutputStream(面向的是計算機,是基礎,方便計算機處理)

字符流:Reader和Writer(面向的是人類,方便人類處理文字)

到這裏,什麼字節流,字符流,gbk,utf-8,亂碼,啥的,不都分分鐘給你說個明明白白。以後再也不是事兒啦。




發佈了49 篇原創文章 · 獲贊 18 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章