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 次数,提升效率
相关推荐
白露与泡影4 分钟前
解密 Pi 的 Harness 工程:Agent 会话如何实现持久化与恢复
java·人工智能·算法
Zane19941 小时前
HashMap 为什么要在长度16、容量必须是2的幂这些细节上较劲
java·后端
长谷深风1111 小时前
为什么你的 Tool 总被模型选错?
java·大数据·ai·llm·ai agent·工具设计·agent设计
莫得感情 o2 小时前
并发 14 · 收官:虚拟线程与结构化并发
java·并发
聚美智数3 小时前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
xierui1231233 小时前
AI Agent 隐私架构:本地化重点为什么是登录态与执行权限
java·人工智能·网络安全·架构
cfm_29144 小时前
Spring AI Tool 调用架构全解
java·人工智能·spring
sun༒4 小时前
Spring @Scheduled 定时任务详解:Cron表达式、执行顺序、优先级与并行调度
java·后端·spring
一次旅行4 小时前
DeepSeek‑V4‑Flash‑Vision‑Exp 小白入门实战|3种传图方式、完整可跑代码、避坑排障
java·前端·人工智能
野生技术架构师4 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端