[十六]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在干活 |
| 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? 是一個轉換流,用于把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轉載于:https://www.cnblogs.com/noteless/p/9639574.html
總結
以上是生活随笔為你收集整理的[十六]JavaIO之InputStreamReader 与 OutputStreamWriter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 09 numpy 聚合函数 - 极值,方
- 下一篇: SDK,JDK,API的区别