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的使用和原理相关推荐

  1. java IO流之BufferedReader和BufferedWriter

    前言:

  2. Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter

    Java IO流学习总结四:缓冲流-BufferedReader.BufferedWriter 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/det ...

  3. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

  4. javaio流_万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)...

    前言 在上一篇的文章获取不错的浏览量后,继续加更的念头一直徘徊在心中,本来是想花段时间深入学习tomcat的,可是tomcat的源码中就有至关重要的NIO,于是得先整一下NIO,但是NIO的基础是BI ...

  5. Java IO流学习总结七:Commons IO 2.5-FileUtils

    Java IO流学习总结七:Commons IO 2.5-FileUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/5497 ...

  6. Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream

    Java IO流学习总结六:ByteArrayInputStream.ByteArrayOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ar ...

  7. Java IO流学习总结二:File

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54581478 本文出自[赵彦军的博客] Java IO流学习总结一:输入输出流 J ...

  8. java io 流选择题_java Io流面试题和选择题

    Java对象的序列化指将一个java对象写入OI流中,与此对应的是,对象的反序列化则从IO流中恢复该java对象.下面就由学习啦小编为大家介绍一下java Io流面试题和选择题的文章,欢迎阅读. ja ...

  9. java io流 教程_Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...

最新文章

  1. 命名实体识别视频51cto
  2. Android获取手机应用程序包的信息
  3. 自定义用户验证控件CustomValidator
  4. 【习题4-1 Uva1589】Xiangqi
  5. Android基础——数据持久化存储
  6. mysql存储过程1267_mysql存储过程一例
  7. 第四章:通过:driver.getAttribute(value); 获取value的值
  8. sv信道模型是什么_Unity Shader|基本光照模型实现中遇到的疑思
  9. dhcp地址分配信息是什么_网络资讯:DHCP 是什么意思
  10. file 创建 txt文件
  11. getParameter和getAttribute区别(超详细分析)
  12. linux服务之FTP服务篇
  13. 艾司博讯:拼多多访客多但是成交率低
  14. 颜色对照表(三)(16进制、RGB、CMYK、HSV、中英文名)
  15. 在校大学生研究生软著申请详解及模板下载
  16. 计算机金融学校排名2015,金融学院2015级各专业排名情况统计表
  17. 抽象代数之三次方程的求根公式和构造一类整系数三次方程
  18. EasyPoi的基本使用
  19. logo制作软件有哪些?这些好用的logo制作软件别错过。​
  20. fedora 下常用软件安装

热门文章

  1. luoguP3690 【模板】Link Cut Tree (动态树)[LCT]
  2. Kali 2017更新源
  3. 201521123032 《Java程序设计》第7周学习总结
  4. vue.js 2.x 能否设置某个组件不被keep-alive 的解决方案
  5. 用汇编语言写的第一个DOS程序
  6. 使用Mockito时遇到的一些问题
  7. Python中表示偶数_蒙特卡洛模拟(Python)深入教程
  8. 判断某程序是64位还是32位
  9. Ubuntu如何搭建Django与Flup和Nginx环境?
  10. 求1+2+3+...+n