[二十一]JavaIO之BufferedReader 與 BufferedWriter

功能簡介

BufferedReader  從字符輸入流中讀取文本,內部緩衝各個字符,從而實現字符、數組和行的高效讀取
BufferedWriter 將文本寫入字符輸出流,內部緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入
 
其實本質仍是緩衝二字
他們內部都有一個緩衝區,就是一個字符數組
BufferedReader 會盡量多的將數據讀取到本身的緩衝區,而後提供的read方法從緩衝區讀取
BufferedWriter 會先將數據寫入到本身的內部緩衝區,從而寫入的效率將會大大提高,而後批量的將數據實際寫入
 
 
BufferedReader  BufferedWriter 也是裝飾器模式
不過他是簡化版的裝飾器模式
沒有抽象的裝飾器角色
BufferedReader 和 BufferedWriter 既充當了抽象的裝飾器角色,又充當了裝飾器實體角色
從下面的聲明以及內部變量能看出來一點端倪(不是說  是你還有你  就必定是裝飾器,仍是要根據下面的業務邏輯的)

是你還有你
並且,他的確是裝飾器模式,下面會簡單介紹
image_5b9a4aee_1d00

構造方法


關鍵成員變量
image_5b9a4aee_6a9

首先:
BufferedReader  須要 Reader 做爲參數
BufferedWriter   須要 Writer 做爲參數
其次:
可選的設置緩衝區的大小,不設置則使用默認值

因此, BufferedReader 和 BufferedWriter 各有兩個構造方法 
 
image_5b9a4aee_40d1
 

BufferedReader 其餘方法

 

read
提供了兩個版本的read方法
int read()
          讀取單個字符
int read(char[] cbuf, int off, int len)
          將字符讀入數組的某一部分,寫入len個 到cbuf 中的off偏移量處
 
之因此說BufferedReader是裝飾器模式不單單是"是你還有你"
read內部,實際上使用的是fill()用來讀取真正的數據到緩衝區內
fill 裏面用了 Reader in

image_5b9a4aee_5c21
 
 
 
支持標記
markSupported  返回true
mark
reset
 
 
String readLine()
讀取一個文本行
經過下列字符之一便可認爲某行已終止:換行 ('\n')、回車 ('\r') 或回車後直接跟着換行
 
 
lines方法
jdk8 中新增的方法 
返回一個由 BufferedReader中的line組成的Stream
image_5b9a4aee_5f45
 
 
BufferedReader也例行提供了
skip
ready
close
 
 

BufferedWriter  其餘方法

 
write
void write(char[] cbuf, int off, int len)
          寫入字符數組的某一部分
void write(int c)
          寫入單個字符。
void write(String s, int off, int len)
          寫入字符串的某一部分
 
public void newLine()
             throws IOException
寫入一個行分隔符  行分隔符字符串由系統屬性 line.separator 定義,而且不必定是單個新行 ('\n') 符
 
close 與 flush
既然是緩衝寫字符
因此必然要有有效的刷新操做,內部經過out來進行刷新
close方法會將緩衝區的數據所有刷新,而後out置空


image_5b9a4aef_7f51

image_5b9a4aef_68b2
 
 

總結

 
BufferedReader  和 BufferedWriter 的邏輯含義很明確
使用內部的緩衝區加快速度
BufferedReader 儘量多的從底層讀取數據到緩衝區,因此加快了read方法的調用
BufferedWriter方法數據先是直接寫入到緩衝區,因此write方法的速度也顯著提升
 
實現緩衝的根本就在於內部的字符數組
 
除非的確不須要,不然應該儘量的使用緩衝,  好比:
BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
 
能夠指定緩衝區的大小,或者接受默認的大小 在大多數狀況下,默認值就足夠大了
相關文章
相關標籤/搜索