面試必問的 Java 位元組流與字元流

業餘草發表於2019-02-25

點選上方“業餘草”,選擇“置頂公眾號”

第一時間獲取技術乾貨和業界資訊!

640?wx_fmt=png

 

最近,我寫的都是一些基礎知識。一些人不屑於看,看了標題就私信我“能不能寫點高階的,看了這標題我就知道內容了,再這樣我就取關了!”

但是也有人表示喜歡看。“內容雖然基礎,但是看完後我有了新的認知!”

所以,我的尷尬的取關資料是時候給大家展示一下了。

640

最近 30 天的趨勢圖如下所示。

640

我要感謝一部分網友通過轉發、評論等形式對我的支援!謝謝你們!


好了,下面我們開始今天的內容。

位元組流和字元流其實很好理解!

位元組流就是 Byte 流,位元組就是 Byte。

字元流就是 Character 流,字元就是 Character。

這裡面有兩個單位換算大家需要記住一下。

  • 1 byte = 8 bit

  • 1 char = 2 byte = 16 bit

雖然 1 bit 才是資料真正的最小單位,但 1 bit 的資訊量太少了。要表示一個有用的資訊,需要好幾個 bit 一起表示。所以大多數情況下,位元組是資料最小的基本單位。

比如,我們熟知的基本型的大小都是 8 bit(也就是1位元組)的整數倍:

  • boolean: 1 byte

  • short: 2 byte

  • int: 4 byte

  • float: 4 byte

  • long: 8 byte

  • double: 8 byte

到這裡,我們認識的都是位元組。但是,Java I/O 的編碼系統提供的 Java IO 庫有兩個支系,面向位元組流的 InputStream 和 OutputStream;面向字元的 Reader 和 Writer。

為什麼要有字元流呢?那是因為英文,我們可以用位元組來表示,但是中文、日文、韓文等沒法用位元組來表示了,所有人們就想到了新的字元編碼集。比如,Unicode 字符集,GB 18030,GBK,Big5,ISO-8859-1 等。

所以,最終就是一個字元用 1 個、2 個或 4 個位元組組成。總而言之,一切都是位元組流,其實沒有字元流這個東西。字元只是根據編碼集對位元組流翻譯之後的產物。

所以,位元組流的 InputStream 和 OutputStream 才是一切的基礎。實際匯流排中流動的只有位元組流。需要對位元組流做特殊解碼才能得到字元流。Java 中負責從位元組流向字元流解碼的橋樑是InputStreamReader 和 InputStreamWriter。

看下面的 InputStreamReader 和 OutputStreamWriter 的結構圖。

640

實際負責編碼和解碼的是 StreamDecoder 類和 StreamEncoder 類。編碼過程中必須指定使用的字元編碼集 Charset。所以 InputStreamReader 和 OutputStreamWriter 的構造器都帶有 Charset 型別的引數。

如果沒有指定編碼集,將使用系統預設編碼集。而我們經常使用的 FileInputReader 和 FileOutputWriter 就是 InputStreamReader 和 OutputStreamWriter 的派生類。

到現在,你是不是想起了那句話。“世界上本來沒有路,走的人多了,也就變成了路。”

計算機中本沒有字元流,一開始只適用於英文,但是網際網路屬於全人類的,所以人們又搞出了字元流。字元只是包裝的位元組而已。

原文連結:淺談 Java 中的位元組流與字元流

640

10T技術資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智慧,GO等等。在公眾號內回覆對應關鍵字或框架名字,即可免費獲取!!

640?wx_fmt=png

 你再主動一點點 640?  我們就有故事了

相關文章