簡介
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在幹活
|
InputStreamReader的構造方法本質上只有一種那就是設置InputStream,這個被適配的對象 另外可選的設置編碼,若是不設置使用系統默認的 設置系統編碼的形式有: 使用給定字符集 和 使用給定字符集解碼器 兩種 |
構造方法中,都無一例外的設置了sd 他是StreamDecoder, decode也就是解碼(read 從字節流讀取成爲字符,解碼)
 |
再回頭仔細看下方法的代碼,你會發現 InputStreamReader的全部方法只有兩種類型,就僅僅作了兩件事情 全部的構造方法設置了內部的StreamDecoder sd的值 剩下的全部的方法都是無差異的轉發到sd中 因此說,根本的解碼是StreamDecoder
|
StreamDecoder究竟是什麼呢?
StreamDecoder繼承了Reader,因此他是一個Reader 另外他內部又包含了一個InputStream in; 這個in 經過他的forInputStreamReader系列方法,經過入參InputStream進行設置 |
|
StreamDecoder中提供的其餘方法(除了forInputStreamReader系列) 又都依賴於內部的私有方法 這些私有方法又藉助於InputStream
|
因此能夠看得出來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 被適配者經過構造方法傳遞,屬於適配器模式中的對象適配器 |
 |
相似InputStreamReader ,他的構造方法也是涉及 被適配者OutputStream 以及字符編碼
若是不設置使用系統默認的字符編碼
設置系統編碼的形式有:
使用給定字符集 和 使用給定字符集解碼器 兩種
|
內部有一個StreamEncoder se, encode 編碼 如同咱們前面介紹的那樣 寫入,是從字符,寫入到二進制, 二進制序列纔是真正的碼, 那麼也就是編碼 全部的構造方法都共同作了初始化se這件事情 |
 |
相似InputStreamReader OutputStreamWriter全部的方法也只是作了兩件事情 構造方法給se賦值 而後其餘方法,無差異的轉發請求到se
 |
StreamEncoder的實現形式 相似StreamDecoder 他實現了Writer,而且內部維護了一個OutputStream 藉助於forOutputStreamWrite系列方法對out進行設置
 |
StreamEncoder 提供的方法
又都依賴於內部的私有的方法
這些私有方法又藉助於OutputStream
好比
|
OutputStreamWriter小結
OutStreamWriter是字符流通向字節流的橋樑
OutStreamWriter的適配器模式以及內部調用StreamEncoder的流程形式,跟InputStreamReader 樣式差很少
只須要了解清楚他的構造方法便可
提供的其餘的write方法,遵循Writer的約定協議
總結
InputStreamReader 和 OutputStreamWriter 是Reader 和 Writer的實現類
他們經過內部的StringDecoder 和 StringEncoder能夠在字符流和字節流的處理過程當中插入編碼和解碼的行爲
轉換流做爲適配器的應用,只須要理解目標和被適配角色便可
目標就是在外面拋頭露面,直接接觸使用的形式
被適配角色就是幕後默默奉獻的
也就是他們提供了Reader和Writer字符形式的讀寫操做方式
而內部則都是使用被適配角色,字節流的形式進行讀寫
中間涉及到的編碼與解碼 則依靠StreamEncoder 和StreamDecoder
轉換流只須要理解記住他們的構造方法便可
而後你就能夠當作什麼都沒發生,他就是一個Reader或者一個Writer