Java-IO流之BufferedReader 和BufferedWriter的使用和原理

时间:2022-09-18 07:53:08

BufferedReader和BufferedWriter出现的目的是为了对FileReader以及FileWriter的读写操作进行增强,而怎么增强呢,原理类似于使用StringBuilder,是把数据先放入他们的一个char数组中,然后再操作char数组。

使用缓冲区的字符流是使用了装饰着模式对FileReader等进行功能上的增强,装饰者模式与继承都可以实现功能上的增强,但是装饰者可以做得更加的灵活,也不会使继承树变得太过复杂。

以下是BufferedWriter源码的一小部分

public class BufferedReader extends Reader {

    private Reader in;  构造函数需要用到的Reader

    private 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
abcdef Process finished with exit code 0

  

Java-IO流之BufferedReader 和BufferedWriter的使用和原理的更多相关文章

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

    在上一篇文章中Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream介绍了缓冲流中的字节流,而这一篇着重介绍缓冲流中字符流Buffered ...

  2. Java:IO流与文件基础

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

  3. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  4. Java IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  5. Java IO流题库

    一.    填空题 Java IO流可以分为   节点流   和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...

  6. Java IO流总结

    Java IO流分类以及主要使用方式如下: IO流 |--字节流 |--字节输入流 InputStream: int read();//一次读取一个字节 int read(byte[] bys);// ...

  7. Java IO流详尽解析

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  8. JAVA.IO流学习笔记

    一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...

  9. 【Java基础】Java IO流的总结

    Java IO流分为输入流和输出流,而输入流和输出流中又分字符流和字节流.顾名思义,输入流则是输入到程序中计算,输出流是把程序的结果输出到文件或者设备.而字符流输入输出以字符为单位,字节流则是以字节为 ...

随机推荐

  1. mybatis-java1234一

    一,简单增删改代码实现 package com.mybatis.mapper; import java.util.List; import com.mybatis.model.Student; pub ...

  2. Blue tooth

    一 . nordic BLE4.0 1.开发nordic的应用需要安装支持keil的pack库和插件 2.nordic的SDK很完整,实例涵盖了几乎所有的应用 https://www.nordicse ...

  3. WIN10FTP服务器搭建

    在WIN10上搭建FTP服务器 先建立两个文件夹,区分上传和下载,做测试 用 然后在管理--服务界面新建一个用户 用户目录下创建一个用户 因为服务应用程序里面没有IIS,所以我们打开控制面板里面的程序 ...

  4. java算法之身份证号码验证

    调用时直接 new IDCard().verify(身份证id);就可以了 实现代码如下: public class IDCard { private String _codeError; //wi ...

  5. HttpWebRequest类库注意事项以及常见问题

    ServicePoint: 提供HTTP连接的连接管理ServicePointManager: 管理ServicePoint 对象的集合 注意事项:1. 将http的request的keepAlive ...

  6. HBase源码实战:ImportTsv

    /** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agr ...

  7. 【Tomcat】Tomcat配置JVM参数步骤

    这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...

  8. web配置详细解释

    <?xml version="1.0"?> <!--注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置.可以使用 Visual S ...

  9. loj&num;528&period; 「LibreOJ β Round &num;4」求和

    求:\(\sum_{i=1}^n\sum_{j=1}^m\mu(gcd(i,j))^2\) 化简可得\(\sum_{i=1}^{min(n,m)}{\lfloor \frac{n}{i} \rfloo ...

  10. Automate the Sizing of your SGA in Oracle 10g

    How much memory does each of the individual components of the SGA need? Oracle now has methods to de ...