【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
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
79 9
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
86 2
|
1天前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
74 60
|
3天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
46 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
24天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
2月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
44 3
|
2月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
2月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
122 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
66 4