请选择 进入手机版 | 继续访问电脑版

[IO] JavaIO之BufferedReader 与 BufferedWriter(二十二)

编程语言 编程语言 4064 人阅读 | 0 人回复

功能简介

BufferedReader 从字符输入流中读取文本,内部缓冲各个字符,从而实现字符、数组和行的高效读取 BufferedWriter 将文本写入字符输出流,内部缓冲各个字符,从而提供单个字符、数组和字符串的高效写入

其实本质还是缓冲二字 他们内部都有一个缓冲区,就是一个字符数组 BufferedReader 会尽可能多的将数据读取到自己的缓冲区,然后提供的read方法从缓冲区读取 BufferedWriter 会先将数据写入到自己的内部缓冲区,从而写入的效率将会大大提升,然后批量的将数据实际写入

BufferedReader BufferedWriter 也是装饰器模式 不过他是简化版的装饰器模式 没有抽象的装饰器角色 BufferedReader 和 BufferedWriter 既充当了抽象的装饰器角色,又充当了装饰器实体角色 从下面的声明以及内部变量能看出来一点端倪(不是说 是你还有你 就一定是装饰器,还是要根据下面的业务逻辑的) 是你还有你 而且,他的确是装饰器模式,下面会简单介绍 image.png

构造方法

关键成员变量 image.png

首先: BufferedReader 需要 Reader 作为参数 BufferedWriter 需要 Writer 作为参数 其次: 可选的设置缓冲区的大小,不设置则使用默认值

所以, BufferedReader 和 BufferedWriter 各有两个构造方法

image.png

BufferedReader 其他方法

read

提供了两个版本的read方法

本文作者:程序员潇然 疯狂的字节X https://crazybytex.com/

//读取单个字符
int read();

//将字符读入数组的某一部分,写入len个 到cbuf 中的off偏移量处  
int read(char[] cbuf, int off, int len);

之所以说BufferedReader是装饰器模式不仅仅是"是你还有你" read内部,实际上使用的是fill()用来读取真正的数据到缓冲区内 fill 里面用了 Reader in image.png

支持标记

markSupported 返回true mark reset

String readLine()

读取一个文本行 通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行

lines方法

jdk8 中新增的方法 返回一个由 BufferedReader中的line组成的Stream image.png

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.png

image.png

总结

BufferedReader 和 BufferedWriter 的逻辑含义很明确 使用内部的缓冲区加快速度 BufferedReader 尽可能多的从底层读取数据到缓冲区,所以加快了read方法的调用 BufferedWriter方法数据先是直接写入到缓冲区,所以write方法的速度也显著提高

实现缓冲的根本就在于内部的字符数组

除非的确不需要,否则应该尽可能的使用缓冲, 比如:

BufferedReader in
= new BufferedReader(new FileReader("foo.in"));

可以指定缓冲区的大小,或者接受默认的大小 在大多数情况下,默认值就足够大了

common_log.png 转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-158-1-1.html

关注下面的标签,发现更多相似文章

文章被以下专栏收录:

    黄小斜学Java

    疯狂的字节X

  • 目前专注于分享Java领域干货,公众号同步更新。原创以及收集整理,把最好的留下。
    包括但不限于JVM、计算机科学、算法、数据库、分布式、Spring全家桶、微服务、高并发、Docker容器、ELK、大数据等相关知识,一起进步,一起成长。
热门推荐
海康摄像头接入 wvp-GB28181-pro平台测试验
[md]### 简介 开箱即用的28181协议视频平台 `https://github.c
[若依]微服务springcloud版新建增添加一个
[md]若依框架是一个比较出名的后台管理系统,有多个不同版本。
[CXX1300] CMake '3.18.1' was not
[md][CXX1300] CMake '3.18.1' was not found in SDK, PATH, or