Java-IO流之BufferedReader 和BufferedWriter的使用和原理
BufferedReader和BufferedWriter出现的目的是为了对FileReader以及FileWriter的读写操作进行增强,而怎么增强呢,原理类似于使用StringBuilder,是把数据先放入他们的一个char数组中,然后再操作char数组。
使用缓冲区的字符流是使用了装饰着模式对FileReader等进行功能上的增强,装饰者模式与继承都可以实现功能上的增强,但是装饰者可以做得更加的灵活,也不会使继承树变得太过复杂。
以下是BufferedWriter源码的一小部分
public class BufferedReader extends Reader {private Reader in; 构造函数需要用到的Readerprivate char cb[]; 自己的char数组,它本身的read()方法将是访问这个数组,这个数组就是缓冲区private int nChars, nextChar; char数组位置和数量的索引
接下来看一下BufferedWriter源码的read()方法:
public int read() throws IOException {synchronized (lock) {ensureOpen();for (;;) {if (nextChar >= nChars) {fill();if (nextChar >= nChars)return -1;}if (skipLF) {skipLF = false;if (cb[nextChar] == '\n') {nextChar++;continue;}}return cb[nextChar++];}}}
这个read()方法是访问的BufferedReader本身的char数组,当发现数组的元素已经被访问完毕就调用fill()方法重新填充char数组。这个就是使用缓冲区的字符流的实质。
同样的,BufferedWriter也是先把数据写入自身的char数组中,刷新的时候再写入文件。
注意:
1、当使用BufferedWriter或者是BufferedReader的时候,是把FileReader的赋给了BufferedReader里面的Reader对象,所以要保存数据到文件的时候调用传入BufferedReader的参数Reader是无效的,需要使用BufferedReader进行刷新或者关BufferedReader之后数据才会保存到文件;
2、当关闭BufferedReader的时候,传入作为参数的reader也会跟着关闭。
3、BufferedReader具有一个特殊的方法readerLine(),功能是读取一行,原理是从char数组中读取,判断是否遇到换行符,是的话返回。
下面有根据传智播客的IO视频自己写的一个BufferedReader代码:
public class MyBufferedReader {private Reader reader;private int count;private int position;private char[] contentArray = new char[1024];private int ch;private final String LINE_SEPARATE = System.getProperty("line.separate");public MyBufferedReader(Reader reader) {this.reader = reader;}public int myReader() throws IOException {if (count == 0) {count = reader.read(contentArray);position = 0;}if (count == -1) {return -1;}count--;ch = contentArray[position];position++;return ch;}public String myReadLine() throws IOException {StringBuilder sb = new StringBuilder(256);int ch = 0;while ((ch = myReader()) != -1) {if (ch == '\r') {continue;}if ((char) ch == '\n') {return sb.toString();}sb.append((char) ch);}if (sb.length() > 0)return sb.toString();return null;}public void close() throws IOException {reader.close();}}
这里是调用的代码:
try (FileWriter fileWriter = new FileWriter("buffer.txt")) {try (BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) {int count = 3;while (count != 0) {bufferedWriter.write("123456");bufferedWriter.newLine();bufferedWriter.write("abcdef");bufferedWriter.newLine();count--;}}}try (FileReader fileReader = new FileReader("buffer.txt")) {MyBufferedReader bufferedReader = new MyBufferedReader(fileReader);String line = null;while ((line = bufferedReader.myReadLine()) != null) {System.out.println(line);}}
运行结果为:
Disconnected from the target VM, address: '127.0.0.1:26416', transport: 'socket'
123456
abcdef
123456
abcdef
123456
abcdefProcess finished with exit code 0
转载于:https://www.cnblogs.com/heisehenbai/p/7897054.html
Java-IO流之BufferedReader 和BufferedWriter的使用和原理相关推荐
- java IO流之BufferedReader和BufferedWriter
前言:
- Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
Java IO流学习总结四:缓冲流-BufferedReader.BufferedWriter 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/det ...
- Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream
Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...
- javaio流_万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)...
前言 在上一篇的文章获取不错的浏览量后,继续加更的念头一直徘徊在心中,本来是想花段时间深入学习tomcat的,可是tomcat的源码中就有至关重要的NIO,于是得先整一下NIO,但是NIO的基础是BI ...
- Java IO流学习总结七:Commons IO 2.5-FileUtils
Java IO流学习总结七:Commons IO 2.5-FileUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/5497 ...
- Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream
Java IO流学习总结六:ByteArrayInputStream.ByteArrayOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ar ...
- Java IO流学习总结二:File
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54581478 本文出自[赵彦军的博客] Java IO流学习总结一:输入输出流 J ...
- java io 流选择题_java Io流面试题和选择题
Java对象的序列化指将一个java对象写入OI流中,与此对应的是,对象的反序列化则从IO流中恢复该java对象.下面就由学习啦小编为大家介绍一下java Io流面试题和选择题的文章,欢迎阅读. ja ...
- java io流 教程_Java基础教程:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...
最新文章
- 命名实体识别视频51cto
- Android获取手机应用程序包的信息
- 自定义用户验证控件CustomValidator
- 【习题4-1 Uva1589】Xiangqi
- Android基础——数据持久化存储
- mysql存储过程1267_mysql存储过程一例
- 第四章:通过:driver.getAttribute(value); 获取value的值
- sv信道模型是什么_Unity Shader|基本光照模型实现中遇到的疑思
- dhcp地址分配信息是什么_网络资讯:DHCP 是什么意思
- file 创建 txt文件
- getParameter和getAttribute区别(超详细分析)
- linux服务之FTP服务篇
- 艾司博讯:拼多多访客多但是成交率低
- 颜色对照表(三)(16进制、RGB、CMYK、HSV、中英文名)
- 在校大学生研究生软著申请详解及模板下载
- 计算机金融学校排名2015,金融学院2015级各专业排名情况统计表
- 抽象代数之三次方程的求根公式和构造一类整系数三次方程
- EasyPoi的基本使用
- logo制作软件有哪些?这些好用的logo制作软件别错过。​
- fedora 下常用软件安装
热门文章
- luoguP3690 【模板】Link Cut Tree (动态树)[LCT]
- Kali 2017更新源
- 201521123032 《Java程序设计》第7周学习总结
- vue.js 2.x 能否设置某个组件不被keep-alive 的解决方案
- 用汇编语言写的第一个DOS程序
- 使用Mockito时遇到的一些问题
- Python中表示偶数_蒙特卡洛模拟(Python)深入教程
- 判断某程序是64位还是32位
- Ubuntu如何搭建Django与Flup和Nginx环境?
- 求1+2+3+...+n