[二十一]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"));
 
可以指定緩沖區的大小,或者接受默認的大小 在大多數情況下,默認值就足夠大了
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM