日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

[十六]JavaIO之InputStreamReader 与 OutputStreamWriter

發(fā)布時間:2025/3/8 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [十六]JavaIO之InputStreamReader 与 OutputStreamWriter 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介

InputStreamReader OutputStreamWriter是轉(zhuǎn)換流 InputStreamReader 是字節(jié)流通向字符流的橋梁,它將字節(jié)流轉(zhuǎn)換為字符流. OutputStreamWriter是字符流通向字節(jié)流的橋梁,它將字符流轉(zhuǎn)換為字節(jié)流. 適配器模式 Reader和Writer 是Target 被適配角色Adaptee是? InputStream / OutputStream
被適配者都是通過構(gòu)造方法傳遞進來的,所以是對象適配器模式

編碼與解碼

經(jīng)常說到編碼和解碼
也就是從字符到字節(jié),或者字節(jié)到字符的轉(zhuǎn)換,轉(zhuǎn)換的規(guī)則就是按照指定的碼表
有的時候可能會混淆,到底哪個方向才是編碼?哪個才是解碼?
只要理解了碼的含義? 指的是二進制的 0 1 的數(shù)值序列
編碼表中都有字符對應(yīng)的數(shù)值序列編碼
把字符從符號轉(zhuǎn)變成二進制序列就是編碼
解碼就是轉(zhuǎn)換為指定的字符形式
字節(jié)流和字符流之間的轉(zhuǎn)換,自然離不開編碼與解碼
計算機最底層數(shù)據(jù)的存儲是二進制序列,也就是字節(jié)
所以如果是從最底層讀取,那么就是涉及二進制到字符的解碼
從字符寫入到最底層,就是字符的編碼

InputStreamReader

適配器模式下,InputStreamReader繼承了Reader,? 也看得出來Reader是目標
這個場景下的適配器,就是可以通過對InputStream調(diào)用Reader 相關(guān)的約定協(xié)議
也就是InputStream包裝成了Reader,看起來用起來像是一個Reader,只不過底層內(nèi)部是InputStream在工作

簡言之,就是他就是一個Reader,他的行為方式也是Reader家族的,只不過里面有一個InputStream在干活

InputStreamReader的構(gòu)造方法本質(zhì)上只有一種那就是設(shè)置InputStream,這個被適配的對象
另外可選的設(shè)置編碼,如果不設(shè)置使用系統(tǒng)默認的
設(shè)置系統(tǒng)編碼的形式有:
使用給定字符集 和 使用給定字符集解碼器 兩種
構(gòu)造方法中,都無一例外的設(shè)置了sd
他是StreamDecoder, decode也就是解碼(read 從字節(jié)流讀取成為字符,解碼)
再回頭仔細看下方法的代碼,你會發(fā)現(xiàn)
InputStreamReader的所有方法只有兩種類型,就僅僅做了兩件事情
所有的構(gòu)造方法設(shè)置了內(nèi)部的StreamDecoder sd的值
剩下的所有的方法都是無差別的轉(zhuǎn)發(fā)到sd中
所以說,根本的解碼是StreamDecoder

StreamDecoder到底是什么呢?

StreamDecoder繼承了Reader,所以他是一個Reader
另外他內(nèi)部又包含了一個InputStream in;
這個in 通過他的forInputStreamReader系列方法,通過入?yún)nputStream進行設(shè)置

StreamDecoder中提供的其他方法(除了forInputStreamReader系列)
又都依賴于內(nèi)部的私有方法
這些私有方法又借助于InputStream

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

InputStreamReader小結(jié)

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

OutputStreamWriter

OutputStreamWriter 也是適配器模式 繼承了Writer
是Writer 的 實現(xiàn)類
Writer是適配器模式的目標Target
被適配者Adaptee是OutputStream
被適配者通過構(gòu)造方法傳遞,屬于適配器模式中的對象適配器
類似InputStreamReader ,他的構(gòu)造方法也是涉及 被適配者OutputStream 以及字符編碼
如果不設(shè)置使用系統(tǒng)默認的字符編碼 設(shè)置系統(tǒng)編碼的形式有: 使用給定字符集 和 使用給定字符集解碼器 兩種
內(nèi)部有一個StreamEncoder se, encode? 編碼 如同我們前面介紹的那樣
寫入,是從字符,寫入到二進制, 二進制序列才是真正的碼,? 那么也就是編碼
所有的構(gòu)造方法都共同做了初始化se這件事情
類似InputStreamReader?? OutputStreamWriter所有的方法也只是做了兩件事情
構(gòu)造方法給se賦值
然后其他方法,無差別的轉(zhuǎn)發(fā)請求到se
StreamEncoder的實現(xiàn)形式 類似StreamDecoder
他實現(xiàn)了Writer,并且內(nèi)部維護了一個OutputStream
借助于forOutputStreamWrite系列方法對out進行設(shè)置
StreamEncoder 提供的方法
又都依賴于內(nèi)部的私有的方法 這些私有方法又借助于OutputStream 比如

OutputStreamWriter小結(jié)

OutStreamWriter是字符流通向字節(jié)流的橋梁 OutStreamWriter的適配器模式以及內(nèi)部調(diào)用StreamEncoder的流程形式,跟InputStreamReader? 樣式差不多 只需要了解清楚他的構(gòu)造方法即可 提供的其他的write方法,遵循Writer的約定協(xié)議

總結(jié)

InputStreamReader?? 和? OutputStreamWriter? 是Reader? 和 Writer的實現(xiàn)類 他們通過內(nèi)部的StringDecoder 和 StringEncoder可以在字符流和字節(jié)流的處理過程中插入編碼和解碼的行為 轉(zhuǎn)換流作為適配器的應(yīng)用,只需要理解目標和被適配角色即可 目標就是在外面拋頭露面,直接接觸使用的形式 被適配角色就是幕后默默奉獻的 也就是他們提供了Reader和Writer字符形式的讀寫操作方式 而內(nèi)部則都是使用被適配角色,字節(jié)流的形式進行讀寫 中間涉及到的編碼與解碼 則依靠StreamEncoder 和StreamDecoder 轉(zhuǎn)換流只需要理解記住他們的構(gòu)造方法即可 然后你就可以當做什么都沒發(fā)生,他就是一個Reader或者一個Writer

轉(zhuǎn)載于:https://www.cnblogs.com/noteless/p/9639574.html

總結(jié)

以上是生活随笔為你收集整理的[十六]JavaIO之InputStreamReader 与 OutputStreamWriter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。