js--23

一、IO 流体系与分类

1. 核心分类

IO 流从两个核心维度划分:

  • 按流的方向
    • 输入流:读取数据(从文件 / 网络到程序)
    • 输出流:写出数据(从程序到文件 / 网络)
  • 按操作文件类型
    • 字节流:可操作所有文件(图片、音频、视频、文本等)
    • 字符流:仅操作纯文本文件(.txt.java 等)

2. 体系结构

  • 字节流顶层父类:InputStream(字节输入流)、OutputStream(字节输出流)
  • 字符流顶层父类:Reader(字符输入流)、Writer(字符输出流)
  • 字符流本质:字符流 = 字节流 + 字符集,底层会自动处理编码 / 解码,避免乱码。

二、字节流(FileInputStream / FileOutputStream)

1. FileInputStream(读取字节)

  • 创建对象:文件不存在直接报错,需确保路径有效。
  • 读取方法
    • read():一次读一个字节,返回 ASCII 码值,读到末尾返回 -1
    • read(byte[] buffer):一次读一个字节数组,返回实际读取字节数,读到末尾返回 -1
  • 释放资源 :必须调用 close() 释放资源,避免泄漏。

2. FileOutputStream(写入字节)

  • 创建对象
    • 参数支持字符串路径或 File 对象。
    • 文件不存在会自动创建,但父级路径必须存在。
    • 文件已存在默认清空内容,可通过构造方法开启续写。
  • 写入方法
    • write(int b):一次写一个字节,参数 int 实际写入低 8 位对应的 ASCII 字符。
    • write(byte[] b):一次写一个字节数组。
    • write(byte[] b, int off, int len):写字节数组的部分数据。
  • 换行 :Windows 系统换行符为 \r\n
  • 释放资源 :必须调用 close() 释放资源。

三、字符流(FileReader / FileWriter)

1. FileReader(读取字符)

  • 构造方法
    • FileReader(File file):关联本地文件创建字符输入流。
    • FileReader(String pathname):通过路径字符串创建字符输入流。
  • 读取方法
    • read():一次读一个字符,读到末尾返回 -1
    • read(char[] buffer):一次读一个字符数组,返回实际读取字符数,读到末尾返回 -1
  • 释放资源 :调用 close() 释放资源 / 关流。

2. FileWriter(写入字符)

  • 构造方法
    • FileWriter(File file) / FileWriter(String pathname):创建字符输出流,默认清空文件。
    • FileWriter(File file, boolean append) / FileWriter(String pathname, boolean append):开启续写开关,不清空文件。
  • 写入细节
    • write(int c):参数为整数,实际写入字符集对应字符。
    • 支持写入字符串、字符数组等。
  • 释放资源 :必须调用 close() 释放资源。

四、编码与解码

1. 编码(字符串 → 字节数组)

  • String.getBytes():使用默认编码方式编码。
  • String.getBytes(String charsetName):使用指定编码(如 UTF-8GBK)编码。

2. 解码(字节数组 → 字符串)

  • new String(byte[] bytes):使用默认编码方式解码。
  • new String(byte[] bytes, String charsetName):使用指定编码解码。

3. 乱码避免规则

  • 不要用字节流读取文本文件,优先使用字符流。
  • 编码和解码必须使用同一个码表和编码方式

五、异常处理(try...catch...finally)

IO 操作会抛出 IOException,必须显式处理,推荐 try...catch...finally 结构:

java

运行

复制代码
FileWriter fw = null;
try {
    fw = new FileWriter("test.txt");
    fw.write("Hello, IO流!");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fw != null) {
        try {
            fw.close(); // 确保资源释放
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • finally 块代码一定会执行(除非虚拟机停止),用于保证资源释放

六、实操选择指南

表格

场景 推荐流类型 核心原因
操作图片、音频、视频 字节流(FileInputStream/FileOutputStream) 字节流支持所有文件类型
操作纯文本文件(读写中文) 字符流(FileReader/FileWriter) 自动处理编码,避免乱码
大文件复制 字节流 + 字节数组缓冲 减少 IO 次数,提升效率
相关推荐
无尽的沉默1 小时前
Thymeleaf 表达式
java·开发语言·前端
无尽的沉默1 小时前
Spring Boot 整合 Thymeleaf 模板引擎
java·前端·spring boot
Java后端的Ai之路1 小时前
【JDK】-JDK 11 新特性内容整理(很全面)
java·开发语言·后端·jdk
莫寒清2 小时前
Java 中 == 与 equals() 的区别
java·面试
冬夜戏雪2 小时前
腐烂橘子/课程表 相关
java
番茄去哪了2 小时前
苍穹外卖day07---Redis缓存优化与购物车功能实现
java·数据库·ide·spring boot·spring·maven·mybatis
毕设源码-钟学长2 小时前
【开题答辩全过程】以 国产汽车的在线销售系统为例,包含答辩的问题和答案
java
亓才孓2 小时前
【MyBatis Plus】Wrapper接口
java·开发语言·数据库·spring boot·mybatis
tianzhiyi1989sq2 小时前
C++工具库之PugiXML使用指南
java·数据库·c++