【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

精品专栏

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

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

在这里插入图片描述

相关文章
|
11天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
3月前
|
Java
Java——编码GBK的不可映射字符
Java——编码GBK的不可映射字符
43 1
|
4月前
|
存储 缓存 Oracle
可能是最漂亮的Java I/O流详解
大家有什么思路吗?评论区一起讨论讨论。我需要使用 Java 逐行读取大约 5-6 GB 的大型文本文件。我怎样才能快速完成此操作?最高赞的回答是叫Peter Lawrey的老哥回答的。大家好,我是南哥。一个Java学习与进阶的领路人,今天指南的是Java I/O流,跟着南哥我们一起在Java之路上成长。本文收录在我开源的《Java学习进阶指南》中,涵盖了想要学习Java、成为更好的Java选手都在偷偷看的核心知识、面试重点。
121 1
可能是最漂亮的Java I/O流详解
|
3月前
|
存储 Java Apache
|
4月前
|
Java Linux
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
Java演进问题之1:1线程模型对于I/O密集型任务如何解决
|
4月前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
4月前
|
Java API 索引
Java中的字符串与字符操作详解
Java中的字符串与字符操作详解
|
5月前
|
Java Serverless
Java字符个数统计代码
Java字符个数统计代码
85 6
|
5月前
|
Java
JAVA工具类匹配重复或者连续的字符和符号
JAVA工具类匹配重复或者连续的字符和符号