1. 程式人生 > >[十七]JavaIO之CharArrayReader 和 CharArrayWriter

[十七]JavaIO之CharArrayReader 和 CharArrayWriter

功能簡介

CharArrayReader  和 CharArrayWriter, 字元陣列作為資料來源的字元讀寫  CharArrayReader  CharArrayWriter  只需要記住他們的根本, CharArray 是資料來源的形式 讀 CharArrayReader 需要接受一個字元陣列作為引數    就是從CharArray 中讀,所以需要一個字元陣列 寫 CharArrayWriter  就是寫入到一個CharArray 中去,所以 它內部維護了一個字元陣列
顯然, 字元陣列都是記憶體中的資料
他們的邏輯類似ByteArrayInputStream ByteArrayOutputStream
,只不過一個是位元組,一個是字元而已
看下欄位對照,相比就能對於實現過程瞭解一二
image_5b99f1e9_3747
image_5b99f1e9_8d3

CharArrayReader

要始終記著Reader的常規約定方法
read 讀取一個字元或者讀取字元到陣列
mark reset markSupported 標記點相關
ready 類似available true 則保證不會阻塞,false則不保證一定阻塞
close 關閉流

構造方法

構造方法的本質就是  CharArrayReader的原理
從一個字元陣列中讀取資料,這個字元陣列通過構造方法傳入
注意:
位元組陣列不是複製而來的,引用直接指向
image_5b99f1e9_5448
使用char buf[] 作為資料來源 image_5b99f1e9_6d0f
使用char buf[]中, off偏移量開始,  length長度個字元
作為資料來源
image_5b99f1ea_3ef2

read

提供了兩個版本的read
讀一個字元
或者讀取字元 到指定的字元陣列中的指定位置

image_5b99f1ea_b8f

標記功能

CharArray作為資料來源,本身就是記憶體中的資料
所以只需要標誌點,可以隨意切換
自然支援標記功能
image_5b99f1ea_5a1a

close

close方法沒有太多實際的事情要做
只是緩衝區置空

image_5b99f1ea_1fc6

CharArrayWriter

writer的常規約定
write 將指定的的字元 字元序列 String ,寫入
append 追加指定的內容
flush
重新整理
close 關閉

構造方法

CharArraywriter 內部維護了一個字元陣列
image_5b99f1ea_f8a
構造方法主要就是對他進行初始化
預設大小是32
image_5b99f1ea_3fd5
緩衝區會隨向流中寫入資料而自動增長
在呼叫write方法過程中
一旦大小超過,將會通過Arrays.copyOf  進行自動增長
增長是建立另外一個數組,原始資料全部拷貝過去
char buf[]
是實際儲存資料的內部陣列
count即是大小,也是下一個將要寫入資料的下標索引

所以想要知道大小,直接返回count
想要重置緩衝區,直接count清零,下次從頭開始寫入即可
image_5b99f1ea_2a5a

write方法

提供了三個版本的write

將指定內容寫入輸出流緩衝區   

public void write(int c) 將一個字元寫入內部緩衝區
public void write(char c[], int off, int len) 將指定的len個字元寫入內部緩衝區
public void write(String str, int off, int len) 將字串的某一部分寫入內部緩衝區

writeTo


將緩衝區內的內容寫入到另外的字元流
過程很簡單,直接呼叫引數out的write方法
image_5b99f1ea_18e9

flush 和close

flush 和close在字元輸出流中並沒有什麼好做的
image_5b99f1ea_7f68

總結

CharArrayReader  和 CharArrayWriter, 字元陣列作為資料來源的字元讀寫 邏輯是類似ByteArrayInputStream ByteArrayOutputStream 的 只需要記住CharArrayReader 接受一個CharArray 從這裡面讀,,read操縱的都是這個字元陣列 CharArrayWriter內部有一個CharArray  資料是寫入到他們裡面的即可,write操縱的是內部的字元陣列