[二十一]JavaIO之BufferedReader 与 BufferedWriter
程序员文章站
2022-06-28 10:37:08
BufferedReader 与 BufferedWriter 是JavaIO中字符操作中一个比较有用的装饰流,可以显著的提高读写速度,本文对他俩进行了简单介绍,也介绍了它们的运行原理以及方法使用 ......
功能简介
bufferedreader 从字符输入流中读取文本,内部缓冲各个字符,从而实现字符、数组和行的高效读取
bufferedwriter 将文本写入字符输出流,内部缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
其实本质还是缓冲二字
他们内部都有一个缓冲区,就是一个字符数组
bufferedreader 会尽可能多的将数据读取到自己的缓冲区,然后提供的read方法从缓冲区读取
bufferedwriter 会先将数据写入到自己的内部缓冲区,从而写入的效率将会大大提升,然后批量的将数据实际写入
|
bufferedreader bufferedwriter 也是装饰器模式 不过他是简化版的装饰器模式 没有抽象的装饰器角色 bufferedreader 和 bufferedwriter 既充当了抽象的装饰器角色,又充当了装饰器实体角色 从下面的声明以及内部变量能看出来一点端倪(不是说 是你还有你 就一定是装饰器,还是要根据下面的业务逻辑的) 是你还有你 而且,他的确是装饰器模式,下面会简单介绍 |
构造方法
关键成员变量 |
首先: bufferedreader 需要 reader 作为参数 bufferedwriter 需要 writer 作为参数 其次: 可选的设置缓冲区的大小,不设置则使用默认值 所以, bufferedreader 和 bufferedwriter 各有两个构造方法
|
bufferedreader 其他方法
read |
提供了两个版本的read方法 |
int read()
读取单个字符
int read(char[] cbuf, int off, int len)
将字符读入数组的某一部分,写入len个 到cbuf 中的off偏移量处
|
之所以说bufferedreader是装饰器模式不仅仅是"是你还有你" read内部,实际上使用的是fill()用来读取真正的数据到缓冲区内 fill 里面用了 reader in |
支持标记 |
marksupported 返回true
mark
reset
|
string readline() 读取一个文本行 通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行 |
lines方法 jdk8 中新增的方法 返回一个由 bufferedreader中的line组成的stream |
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置空 |
总结
bufferedreader 和 bufferedwriter 的逻辑含义很明确
使用内部的缓冲区加快速度
bufferedreader 尽可能多的从底层读取数据到缓冲区,所以加快了read方法的调用
bufferedwriter方法数据先是直接写入到缓冲区,所以write方法的速度也显著提高
实现缓冲的根本就在于内部的字符数组
除非的确不需要,否则应该尽可能的使用缓冲, 比如:
bufferedreader in
= new bufferedreader(new filereader("foo.in"));
可以指定缓冲区的大小,或者接受默认的大小 在大多数情况下,默认值就足够大了
下一篇: 网店教程 36个淘宝运营技巧提升店铺流量