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

简介: 本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。

在这里插入图片描述

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

大家好,我是水滴~~

本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。

  • 文件字符输入流(FileReader)用于读取文本文件内容。将磁盘中文本文件的数据,读取到内存中使用。
  • 文件字符输出流(FileWriter)用于向文本文件写入内容。将内存中的数据,写入到磁盘文本文件中。

在这里插入图片描述

FileReader(文件字符输入流)

FileReader 是文件字符输入流,用于读取文本文件。该类的父类为 InputStreamReader,它是字节流和字符流的桥梁,它读取字节流并使用指定的字符集解码为字符。InputStreamReader 的父类便是字符输入流 Reader 了。

构造函数

FileReader 类有三个构造函数,它们使用默认的字符集来读取文本文件。如果想要指定字符集,需要借助其父类 InputStreamReader

FileReader(String fileName)

通过文件路径名,创建文件字符输入流 FileReader 实例。

FileReader(File file)

通过文件 File 实例,创建文件字符输入流 FileReader 实例。

FileReader(FileDescriptor fd)

通过文件描述符 FileDescriptor 实例,创建文件字符输入流 FileReader 实例。

常用方法

int read()

从流中读取一个字符。该方法会阻塞,直到字符可用、发生 I/O 异常或达到流的结尾。
返回值:该方法将读取的内容以 0 至 65535(0x00 - 0xffff) 范围内的整数返回,如果到达流的末尾,则为 -1。

int read(char cbuf[])

从流中读取多个字符,并存入缓冲区数组 cbuf 中。该方法会阻塞,直到字符可用、发生 I/O 异常或达到流的结尾。
返回值:读取的字符数。如果已经到达流的结尾,则为 -1。

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

从流中读取多个字符,并存入缓冲区数组 cbuf 一部分,从缓冲区的 off 下标处开始存储,最多存入 len 个字符。
返回值:读取的字符数。如果已经到达流的结尾,则为 -1。

void close()

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

读取文件的案例

案例一:每次读取一个字符

磁盘中有一个文件 c:/io/06_UTF8.txt ,其内容为:水滴技术

代码示例:

public static void reader1() throws IOException {
   
   
    // 通过文件路径名,创建一个 FileReader 实例
    FileReader fr = new FileReader("c:/io/06_UTF8.txt");

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

    // 关闭流并释放资源
    fr.close();
}

输出内容:

27700
28404
25216
26415
-1

案例二:循环读取,每次读取一个字符

磁盘中有一个文件 c:/io/06_UTF8.txt,其内容为:水滴技术

代码示例:

public static void reader2() throws IOException {
   
   
    // 通过文件路径名,创建一个 FileReader 实例
    FileReader fr = new FileReader("c:/io/06_UTF8.txt");

    // 读取的文件内容
    int read;
    // 循环读取文件内容
    while ((read = fr.read()) != -1) {
   
   
        // 将读取的文件内容转为 char
        System.out.println((char) read);
    }

    // 关闭流并释放资源
    fr.close();
}

输出内容:

水
滴
技
术

案例三:使用字符数组,每次读取多个字符

磁盘中有一个文件 c:/io/07_UTF8.txt,其内容为:水滴技术YYDS

代码示例:

public static void reader3() throws IOException {
   
   
    // 通过文件路径名,创建一个 FileReader 实例
    FileReader fr = new FileReader("c:/io/07_UTF8.txt");

    // 存储读取的内容
    char[] chars = new char[5];

    // 读取字符的长度
    int len;
    // 循环读取内容
    while ((len = fr.read(chars)) != -1) {
   
   
        // 将字符数组转为字符串
        System.out.println(new String(chars, 0, len));
    }

    // 关闭流并释放资源
    fr.close();

}

输出内容:

水滴技术Y
YDS

案例四:使用 InputStreamReader 类读取文件,文件字符集为 GBK

磁盘中有一个文件 c:/io/10_GBK.txt,其内容为:水滴技术YYDS,其字符集为:GBK

代码示例:

public static void reader4() throws IOException {
   
   
    // 创建一个 InputStreamReader 实例,并指定字符集
    InputStreamReader fsr = new InputStreamReader(new FileInputStream("c:/io/10_GBK.txt"), "GBK");

    // 存储读取的内容
    char[] chars = new char[5];

    // 读取字符的长度
    int len;
    // 循环读取内容
    while ((len = fsr.read(chars)) != -1) {
   
   
        // 将字符数组转为字符串
        System.out.println(new String(chars, 0, len));
    }

    // 关闭流并释放资源
    fsr.close();
}

输出内容:

水滴技术Y
YDS

FileWriter(文件字符输出流)

FileWriter 是文件字符输出流,用于向文本文件写入内容。该类的父类为 InputStreamWriter,它是字符流和字节流的桥梁,将字符通过指定的字符集编码成字节,再进行写入。InputStreamWriter的父类便是字符输出流 Writer 了。

构造函数

FileWriter 类有五个构造函数,它们使用默认的字符集来向文本文件写入内容。如果想要指定字符集,需要借助其父类 InputStreamWriter

FileWriter(String fileName)

通过文件路径名,创建文件字符输出流 FileWriter 实例。

FileWriter(String fileName, boolean append)

通过文件路径名创建文件字符输出流。appendtrue 时表示从原数据末尾追加,否则会覆盖原数据。

FileWriter(File file)

通过文件 File 实例,创建文件字符输出流 FileWriter 实例。

FileWriter(File file, boolean append)

通过文件 File 实例,创建文件字符输出流 FileWriter 实例。appendtrue 时表示从原数据末尾追加,否则会覆盖原数据。

FileWriter(FileDescriptor fd)

通过文件描述符 FileDescriptor 实例,创建文件字符输出流 FileWriter 实例。

常用方法

void write(int c)

向输出流写入一个字符。

void write(char cbuf[])

向输出流写入一个字符数组。

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

向输出流写入数组的一部分。从数组 cbuf 的下标 off 处开始,最多写入 len 个字符。

void write(String str)

向输出流写入一个字符串。

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

向输出流写入字符串的一部分。

void flush()

刷新该输出流,强制将缓存区中的字符写出去。

void close()

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

写入文件的案例

案例一:一次写入一个字符

代码示例:

public static void writer1() throws IOException {
   
   
    // 通过文件路径创建 FileWriter 实例,默认使用 UTF8 字符集
    FileWriter fw = new FileWriter("c:/io/05_UTF8.txt");

    // 写入一个字符
    fw.write(27700); // 水(UTF-8)

    // 写入一个字符
    fw.write(28404); // 滴(UTF-8)

    // 写入一个字符
    fw.write(25216); // 技(UTF-8)

    // 写入一个字符
    fw.write(26415); // 术(UTF-8)

    // 关闭流并释放资源
    fw.close();
}

会创建一个 c:/io/05_UTF8.txt 文件,文件内容为:水滴技术

案例二:通过字符数组,一次写入多个字符

代码示例:

public static void writer2() throws IOException {
   
   
    // 通过文件路径创建 FileWriter 实例
    FileWriter fw = new FileWriter("c:/io/06_UTF8.txt");
    // 字符数组
    char[] chars = {
   
   '水', '滴', '技', '术'};

    // 将字符数组写入流
    fw.write(chars);

    // 关闭流并释放资源
    fw.close();
}

会创建一个 c:/io/06_UTF8.txt 文件,文件内容为:水滴技术

案例三:通过字符数组偏移量,一次写入多个字符

代码示例:

public static void writer3() throws IOException {
   
   
    // 通过文件路径创建 FileWriter 实例
    FileWriter fw = new FileWriter("c:/io/07_UTF8.txt");
    // 字符数组
    char[] chars = {
   
   '1', '2', '3', '水', '滴', '技', '术', 'Y', 'Y', 'D', 'S'};

    // 将字符数组的一部分写入流
    fw.write(chars, 3, chars.length - 3);

    // 关闭流并释放资源
    fw.close();
}

会创建一个 c:/io/07_UTF8.txt 文件,文件内容为:水滴技术YYDS

案例四:通过字符串,一次写入多个字符

代码示例:

public static void writer4() throws IOException {
   
   
    // 通过文件路径创建 FileWriter 实例
    FileWriter fw = new FileWriter("c:/io/08_UTF8.txt");

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

    // 关闭流并释放资源
    fw.close();
}

会创建一个 c:/io/08_UTF8.txt 文件,文件内容为:水滴技术

案例五:通过字符串偏移量,一次写入多个字符

代码示例:

public static void writer5() throws IOException {
   
   
    // 通过文件路径创建 FileWriter 实例
    FileWriter fw = new FileWriter("c:/io/09_UTF8.txt");

    String str = "123水滴技术YYDS";
    // 将字符串写入流
    fw.write(str, 3, str.length() - 3);

    // 关闭流并释放资源
    fw.close();
}

会创建一个 c:/io/09_UTF8.txt 文件,文件内容为:水滴技术YYDS

案例六:通过父类 OutputStreamWriter 写入 GBK 字符集数据

代码示例:

public static void writer6() throws IOException {
   
   
    // 创建一个 OutputStreamWriter 实例,并指定字符集
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c:/io/10_GBK.txt"), Charset.forName("GBK"));
    String str = "123水滴技术YYDS";
    // 将字符串写入流
    osw.write(str, 3, str.length() - 3);

    // 关闭流并释放资源
    osw.close();
}

会创建一个 c:/io/10_GBK.txt 文件,文件内容为:水滴技术YYDS,文件字符集为:GBK


系列文章

相关文章
|
2月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
196 1
|
5月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
150 0
|
5月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
349 0
|
5月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
271 14
|
6月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
485 5
|
6月前
|
网络协议 安全 Java
实现Java语言的文件断点续传功能的技术方案。
像这样,我们就完成了一项看似高科技、实则亲民的小工程。这样的技术实现不仅具备实用性,也能在面对网络不稳定的挑战时,稳稳地、不失乐趣地完成工作。
383 0
|
9月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
9月前
|
存储 传感器 缓存
java变量与数据类型:整型、浮点型与字符类型
### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
320 15
|
10月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
257 4
|
10月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。