簡介
InputStreamReader OutputStreamWriter是轉換流
InputStreamReader 是字節流通向字符流的橋梁,它將字節流轉換為字符流.
OutputStreamWriter是字符流通向字節流的橋梁,它將字符流轉換為字節流.
適配器模式
Reader和Writer 是Target
被適配角色Adaptee是 InputStream / OutputStream
|
被適配者都是通過構造方法傳遞進來的,所以是對象適配器模式 |
編碼與解碼
經常說到編碼和解碼 也就是從字符到字節,或者字節到字符的轉換,轉換的規則就是按照指定的碼表 有的時候可能會混淆,到底哪個方向才是編碼?哪個才是解碼? |
只要理解了碼的含義 指的是二進制的 0 1 的數值序列 編碼表中都有字符對應的數值序列編碼 把字符從符號轉變成二進制序列就是編碼 解碼就是轉換為指定的字符形式 |
字節流和字符流之間的轉換,自然離不開編碼與解碼 計算機最底層數據的存儲是二進制序列,也就是字節 所以如果是從最底層讀取,那么就是涉及二進制到字符的解碼 從字符寫入到最底層,就是字符的編碼 |
InputStreamReader
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小結
OutStreamWriter是字符流通向字節流的橋梁
OutStreamWriter的適配器模式以及內部調用StreamEncoder的流程形式,跟InputStreamReader 樣式差不多
只需要了解清楚他的構造方法即可
提供的其他的write方法,遵循Writer的約定協議
總結
InputStreamReader 和 OutputStreamWriter 是Reader 和 Writer的實現類
他們通過內部的StringDecoder 和 StringEncoder可以在字符流和字節流的處理過程中插入編碼和解碼的行為
轉換流作為適配器的應用,只需要理解目標和被適配角色即可
目標就是在外面拋頭露面,直接接觸使用的形式
被適配角色就是幕后默默奉獻的
也就是他們提供了Reader和Writer字符形式的讀寫操作方式
而內部則都是使用被適配角色,字節流的形式進行讀寫
中間涉及到的編碼與解碼 則依靠StreamEncoder 和StreamDecoder
轉換流只需要理解記住他們的構造方法即可
然后你就可以當做什么都沒發生,他就是一個Reader或者一個Writer