1. 程式人生 > >JavaIO之InputStreamReader 與 OutputStreamWriter

JavaIO之InputStreamReader 與 OutputStreamWriter

InputStreamReader OutputStreamWriter是轉換流 InputStreamReader 是位元組流通向字元流的橋樑,它將位元組流轉換為字元流. OutputStreamWriter是字元流通向位元組流的橋樑,它將字元流轉換為位元組流. 介面卡模式 Reader和Writer 是Target 被適配角色Adaptee是 InputStream / OutputStream 被適配者都是通過構造方法傳遞進來的,所以是物件介面卡模式

回到頂部 編碼與解碼 經常說到編碼和解碼 也就是從字元到位元組,或者位元組到字元的轉換,轉換的規則就是按照指定的碼錶 有的時候可能會混淆,到底哪個方向才是編碼?哪個才是解碼? 只要理解了碼的含義 指的是二進位制的 0 1 的數值序列 編碼表中都有字元對應的數值序列編碼 把字元從符號轉變成二進位制序列就是編碼 解碼就是轉換為指定的字元形式 位元組流和字元流之間的轉換,自然離不開編碼與解碼 計算機最底層資料的儲存是二進位制序列,也就是位元組 所以如果是從最底層讀取,那麼就是涉及二進位制到字元的解碼 從字元寫入到最底層,就是字元的編碼

回到頂部 InputStreamReader 介面卡模式下,InputStreamReader繼承了Reader, 也看得出來Reader是目標 這個場景下的介面卡,就是可以通過對InputStream呼叫Reader 相關的約定協議 也就是InputStream包裝成了Reader,看起來用起來像是一個Reader,只不過底層內部是InputStream在工作

簡言之,就是他就是一個Reader,他的行為方式也是Reader家族的,只不過裡面有一個InputStream在幹活 image_5b99da0f_2987 InputStreamReader的構造方法本質上只有一種那就是設定InputStream,這個被適配的物件 另外可選的設定編碼,如果不設定使用系統預設的 設定系統編碼的形式有: 使用給定字符集 和 使用給定字符集解碼器 兩種 構造方法中,都無一例外的設定了sd 他是StreamDecoder, decode也就是解碼(read 從位元組流讀取成為字元,解碼) image_5b99da0f_6f6c 再回頭仔細看下方法的程式碼,你會發現 InputStreamReader的所有方法只有兩種型別,就僅僅做了兩件事情 所有的構造方法設定了內部的StreamDecoder sd的值 剩下的所有的方法都是無差別的轉發到sd中 所以說,根本的解碼是StreamDecoder image_5b99da0f_4873

回到頂部 StreamDecoder到底是什麼呢? StreamDecoder繼承了Reader,所以他是一個Reader 另外他內部又包含了一個InputStream in; 這個in 通過他的forInputStreamReader系列方法,通過入參InputStream進行設定 image_5b99da0f_78a6 StreamDecoder中提供的其他方法(除了forInputStreamReader系列) 又都依賴於內部的私有方法 這些私有方法又藉助於InputStream image_5b99da0f_43e7

所以可以看得出來InputStreamReader只是一個外包公司,他的活都是轉包給StreamDecoder的

InputStreamReader小結 內部藉助StreamDecoder的實現過程作為了解 需要記住InputStreamReader 是一個轉換流,用於把InputStream轉換為Reader 也就是讓一個InputStream能夠以Reader的方式進行工作, InputStreamReader 繼承了Reader,所以他是一個Reader 他是Reader的實現類,提供了Reader協議常規的讀取方法以及配套方法 掌握了構造方法即可,其他方法語義同Reader中的約定 public int read() throws IOException 讀取單個字元,返回讀取到的字串 public int read(char cbuf[], int offset, int length) 讀取字元到指定陣列cbuf[] ,從指定偏移量offset開始儲存,讀取length個 public boolean ready() true表示下一個read()方法保證不會阻塞 public void close() throws IOException

回到頂部 OutputStreamWriter OutputStreamWriter 也是介面卡模式 繼承了Writer 是Writer 的 實現類 Writer是介面卡模式的目標Target 被適配者Adaptee是OutputStream 被適配者通過構造方法傳遞,屬於介面卡模式中的物件介面卡 image_5b99da0f_71a1 類似InputStreamReader ,他的構造方法也是涉及 被適配者OutputStream 以及字元編碼 如果不設定使用系統預設的字元編碼 設定系統編碼的形式有: 使用給定字符集 和 使用給定字符集解碼器 兩種

內部有一個StreamEncoder se, encode 編碼 如同我們前面介紹的那樣 寫入,是從字元,寫入到二進位制, 二進位制序列才是真正的碼, 那麼也就是編碼 所有的構造方法都共同做了初始化se這件事情 image_5b99da0f_48c9 類似InputStreamReader OutputStreamWriter所有的方法也只是做了兩件事情 構造方法給se賦值 然後其他方法,無差別的轉發請求到se image_5b99da0f_25ba StreamEncoder的實現形式 類似StreamDecoder 他實現了Writer,並且內部維護了一個OutputStream 藉助於forOutputStreamWrite系列方法對out進行設定 image_5b99da0f_29a0 StreamEncoder 提供的方法 又都依賴於內部的私有的方法 這些私有方法又藉助於OutputStream 比如 image_5b99da0f_47f3

OutputStreamWriter小結 OutStreamWriter是字元流通向位元組流的橋樑 OutStreamWriter的介面卡模式以及內部呼叫StreamEncoder的流程形式,跟InputStreamReader 樣式差不多 只需要瞭解清楚他的構造方法即可 提供的其他的write方法,遵循Writer的約定協議

回到頂部 總結 InputStreamReader 和 OutputStreamWriter 是Reader 和 Writer的實現類 他們通過內部的StringDecoder 和 StringEncoder可以在字元流和位元組流的處理過程中插入編碼和解碼的行為

轉換流作為介面卡的應用,只需要理解目標和被適配角色即可 目標就是在外面拋頭露面,直接接觸使用的形式 被適配角色就是幕後默默奉獻的 也就是他們提供了Reader和Writer字元形式的讀寫操作方式 而內部則都是使用被適配角色,位元組流的形式進行讀寫 中間涉及到的編碼與解碼 則依靠StreamEncoder 和StreamDecoder

轉換流只需要理解記住他們的構造方法即可 然後你就可以當做什麼都沒發生,他就是一個Reader或者一個Writer