【Java I/O 流】字符缓冲流:BuffreadReader 和 BufferedWriter

简介: 缓冲流是一个包装流,在创建缓冲流实例时,需要传入底层真实操作的输入或输出流。其主要的作用就是为了提高读写效率而生的。今天讲的字符缓冲流有两个:`BuffreadReader` (字符缓冲输入流)和 `BufferedWriter`(字符缓冲输出流)。本文会介绍它们的构造函数和一些常用方法,最后使用真实案例来学习字符缓冲流是如何使用的。

在这里插入图片描述

❤️ 个人主页:水滴技术
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏:Java 教程:从入门到精通

大家好,我是水滴~~

缓冲流是一个包装流,在创建缓冲流实例时,需要传入底层真实操作的输入或输出流。其主要的作用就是为了提高读写效率而生的。

今天讲的字符缓冲流有两个:BuffreadReader (字符缓冲输入流)和 BufferedWriter(字符缓冲输出流)。本文会介绍它们的构造函数和一些常用方法,最后使用真实案例来学习字符缓冲流是如何使用的。

BufferedReader(字符缓冲输入流)

BufferedReaderReader 的包装流,用于缓冲字符输入流,不必在每个字符读取时都要进行系统底层调用,提高了读取效率。当创建 BufferedReader 实例时,会创建一个内部缓冲区数组,用于暂时存储从流中读取的数据。而在读取缓冲流时,会从该数组中读取,读完后会重新填充,直到流中的数据被全部读完。

构造函数

字符缓冲输入流的构造函数需要传入一个字节输入流,该字符输入流为实际读取的流对象。

BufferedReader(Reader in)

使用字符输入流 Reader 创建一个字符缓冲区输入流 BufferedReader ,其缓冲区使用默认大小。

BufferedReader(Reader in, int sz)

使用字符输入流 Reader 和 指定的缓冲区大小,创建一个字符缓冲区输入流 BufferedReader

常用方法

int read()

从字符缓冲区输入流中读取一个字符,读取的字符以 int 型返回,如果读取至末尾,则返回值 -1。

int read(char cbuf[], int off, int len)

从字符缓冲区输入流中读取多个字符,并存入数组 cbuf 中,从缓冲区的 off 下标处开始存储,最多存入 len 个字符。返回值为读取的字符数,如果读取流的末尾,则返回 -1。

String readLine()

读取一行文字。一行由换行符“\n”或回车符“\r”表示。返回结果为这一行字符的文本内容。

void close()

关闭输入流,并释放与之相关的所有系统资源。

读取案例

这里只介绍如何使用缓冲区输入流来包装底层输入流,更多的读取操作与其他字符输入流一至,你可以参考前面的《【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter》,这里就不再赘述了。

案例一:使用字符缓冲输入流读取文本文件

首选创建一个文件字符输入流 FileReader ,用于读取文本文件。再创建一个字符缓冲输入流 BufferedReader,其底层字符输入流使用创建好的 FileReader 实例。
然后就可以使用该缓冲流进行读取文件中的内容了。
最后关闭流,这里只关闭缓冲流即可,同时它会关闭底层的字符输入流。

代码示例:

public static void read1() throws IOException {
   
   
    // 创建字符输入流 FileReader 实例
    FileReader fr = new FileReader("c:/io/13.txt");
    // 创建字符缓冲输入流 BufferedReader 实例,底层字符输入流使用 FileReader
    BufferedReader br = new BufferedReader(fr);

    // 读取一个字符
    System.out.println((char) br.read());
    // 读取一个字符
    System.out.println((char) br.read());
    // 读取一个字符
    System.out.println((char) br.read());
    // 读取一个字符
    System.out.println((char) br.read());

    // 关闭输入流,只关闭缓冲区输入流即可,会同时关闭底层输入流
    br.close();
}

输出内容:

水
滴
技
术

BufferedWriter(字符缓冲输出流)

BufferedWriterWriter 的包装流,用于缓冲字符输出流,不必在每个字符写入时都要进行系统底层调用,提高了写入效率。当创建 BufferedWriter 实例时,会创建一个内部缓冲区数组,用于暂时存储从内存中写入的数据。缓冲区被填充满,会刷新缓冲区,进行真正的写入操作。

构造函数

字符缓冲输出流的构造函数需要传入一个字节输出流,该字符输出流为实际要写入的流对象。

BufferedWriter(Writer out)

使用字符输出流 Writer 实例创建一个字符缓冲区输出流 BufferedWriter 实例,其缓冲区使用默认大小。

BufferedWriter(Writer out, int sz)

使用字符输出流 Writer 实例和指定的缓冲区大小,创建一个字符缓冲区输出流 BufferedWriter 实例。

常用方法

void write(int c)

向字符缓冲区输出流写入一个字符。

void write(char cbuf[], int off, int len)

向字符缓冲区输出流中写入多个字符,从缓存区 boff 下标处开始写入 len 个字符。

void write(String s, int off, int len)

向字符缓冲区输出流中写入字符串,从字符串的 off 下标开始,写入 len 个字符。

void newLine()

写入一个回车符。

void flush()

刷新该输出流,强制将缓存区中的字节写入底层输出流。

void close()

关闭该输出流,并释放与之相关的所有系统资源。

写入案例

案例一:使用字符缓冲输出流向文本文件写入内容

首先创建一个文件字符输出流 FileWriter 实例,用于向文件写入内容。再创建一个字符缓冲输出流 BufferedWriter 实例。其底层字符输出流使用创建好的 FileWriter 实例。
然后就可以使用该缓冲流向文本文件写入内容了。
最后关闭流,这里只关闭缓冲流即可,同时它会关闭底层的字符输出流。

代码示例:

public static void write1() throws IOException {
   
   
    // 创建字符输出流 FileWriter 实例
    FileWriter fw = new FileWriter("c:/io/14.txt");
    // 创建字符缓冲输出流 BufferedWriter 实例,底层字符输出流使用 FileWriter
    BufferedWriter bw = new BufferedWriter(fw);

    // 写入字符串
    bw.write("水");
    // 写入字符串
    bw.write("滴");
    // 写入字符串
    bw.write("技术");

    // 关闭输出流,只关闭缓冲区输出流即可,会同时关闭底层输出流
    bw.close();
}

该操作会创建一个 c:/io/14.txt 文件,写入内容:水滴技术


系列文章

🔥 【Java I/O 流】文件的操作——java.io.File 类详解

🔥 【Java I/O 流】I/O 流的原理与流的分类

🔥 【Java I/O 流】字节输入输出流:InputStream & OutputStream

🔥 【Java I/O 流】文件字节输入输出流:FileInputStream & FileOutputStream(文件读写案例)

🔥 【Java I/O 流】字符输入输出流:Reader 和 Writer

🔥 【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter

🔥 【Java I/O 流】字节缓冲流:BufferedInputStream 和 BufferedOutputStream

精品专栏

👍 《IDEA 教程:从入门到精通

👍 《 Java 教程:从入门到精通

👍 《MySQL 教程:从入门到精通

在这里插入图片描述

相关文章
|
4天前
|
存储 缓存 Java
Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问
【6月更文挑战第22天】Java中的缓冲流提升I/O性能,通过内存缓冲区减少对硬件访问。`BufferedInputStream`和`BufferedOutputStream`用于字节流,缓存数据批量读写。`BufferedReader`和`BufferedWriter`处理字符流,支持按行操作。使用后务必关闭流。
15 3
|
13天前
|
JavaScript Java Android开发
在cmd中运行javac编译java文件报错: 编码GBK的不可映射字符、 非法字符: \65279
在cmd中运行javac编译java文件报错: 编码GBK的不可映射字符、 非法字符: \65279
15 1
|
26天前
|
存储 监控 Java
深入探索Java语言的NIO(New I/O)技术
深入探索Java语言的NIO(New I/O)技术
|
2天前
|
Java Serverless
Java字符个数统计代码
Java字符个数统计代码
20 6
|
9天前
|
存储 缓存 Java
面试官:Java中缓冲流真的性能很好吗?我看未必
【6月更文挑战第9天】面试官:Java中缓冲流真的性能很好吗?我看未必
39 3
|
12天前
|
Java 视频直播 数据库连接
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
16 2
|
12天前
|
存储 网络协议 Java
Java I/O 详解:基础、文件操作与 NIO 实践
Java I/O 详解:基础、文件操作与 NIO 实践
15 1
|
23小时前
|
Java 机器人 程序员
Java中的文件I/O操作:流、读写和NIO详解
Java中的文件I/O操作:流、读写和NIO详解
|
2天前
|
Java
java使用基本流和缓冲流操作文件时间对比
java使用基本流和缓冲流操作文件时间对比
6 0
|
2天前
|
Java API 开发者
Java中的文件I/O操作:流、读写和NIO详解
Java中的文件I/O操作:流、读写和NIO详解