[二十一]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"));
 
能够指定缓冲区的大小,或者接受默认的大小 在大多数状况下,默认值就足够大了
相关文章
相关标签/搜索