JavaIO之BufferedReader 与 BufferedWriter(二十二)
### 功能简介BufferedReader从字符输入流中读取文本,内部缓冲各个字符,从而实现字符、数组和行的高效读取
BufferedWriter 将文本写入字符输出流,内部缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
其实本质还是缓冲二字
他们内部都有一个缓冲区,就是一个**字符数组**
BufferedReader 会尽可能多的将数据读取到自己的缓冲区,然后提供的read方法从缓冲区读取
BufferedWriter 会先将数据写入到自己的内部缓冲区,从而写入的效率将会大大提升,然后批量的将数据实际写入
BufferedReaderBufferedWriter 也是装饰器模式
不过他是简化版的装饰器模式
没有抽象的装饰器角色
BufferedReader 和 BufferedWriter 既充当了抽象的装饰器角色,又充当了装饰器实体角色
从下面的声明以及内部变量能看出来一点端倪(不是说是你还有你就一定是装饰器,还是要根据下面的业务逻辑的)
**是你还有你**
而且,他的确是装饰器模式,下面会简单介绍
!(data/attachment/forum/202208/26/154614igg63mg8g266r06m.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### 构造方法
关键成员变量
!(data/attachment/forum/202208/26/154627qoz4ggt5z95yoyt5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
首先:
BufferedReader需要 Reader 作为参数
BufferedWriter 需要 Writer 作为参数
其次:
可选的设置缓冲区的大小,不设置则使用默认值
所以, BufferedReader 和 BufferedWriter 各有两个构造方法
!(data/attachment/forum/202208/26/154642i8e81uus8lmx8upm.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### BufferedReader 其他方法
### read
提供了两个版本的read方法
`本文作者:程序员潇然 疯狂的字节X https://crazybytex.com/`
```java
//读取单个字符
int read();
//将字符读入数组的某一部分,写入len个 到cbuf 中的off偏移量处
int read(char[] cbuf, int off, int len);
```
之所以说BufferedReader是装饰器模式不仅仅是"**是你还有你**"
read内部,实际上使用的是fill()用来读取真正的数据到缓冲区内
fill 里面用了 Reader in
!(data/attachment/forum/202208/26/154818k2v1vtvxexr23rxv.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
#### 支持标记
markSupported返回true
mark
reset
#### String readLine()
读取一个文本行
通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行
#### lines方法
jdk8 中新增的方法
返回一个由 BufferedReader中的line组成的Stream
!(data/attachment/forum/202208/26/154854p0ll1mtlz1hlvu2l.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
BufferedReader也例行提供了
skip
ready
close
### BufferedWriter其他方法
#### write
```java
//写入字符数组的某一部分
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置空
!(data/attachment/forum/202208/26/155046qppcxwv4zns3pp3c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
!(data/attachment/forum/202208/26/155056q5xxc2fx18b2n6c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### 总结
BufferedReader和 BufferedWriter 的逻辑含义很明确
使用内部的缓冲区加快速度
BufferedReader 尽可能多的从底层读取数据到缓冲区,所以加快了read方法的调用
BufferedWriter方法数据先是直接写入到缓冲区,所以write方法的速度也显著提高
实现缓冲的根本就在于内部的字符数组
除非的确不需要,否则应该尽可能的使用缓冲,比如:
```java
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
```
可以指定缓冲区的大小,或者接受默认的大小 在大多数情况下,默认值就足够大了
!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-158-1-1.html `
页:
[1]