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-8、GBK)编码。

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 次数,提升效率
相关推荐
tianbin9116 分钟前
批处理与微调辅助场景:Claude 中转并发、链路缓存与压测对比
java·开发语言·缓存
frjc14 分钟前
Spring AI 里 ChatClient 和 ChatModel 有什么区别?什么时候该用哪个?
java·开发语言·spring·ai
Wang's Blog23 分钟前
Java 项目实战: 交友项目 - 圈子功能的表设计方案
java·开发语言·交友
文丑颜不良啊41 分钟前
LeetCode601~625题目解析
java·leetcode
文丑颜不良啊1 小时前
LeetCode651~675题目解析
java·leetcode
frjc1 小时前
Spring WebFlux SSE 长连接,可以替换为 Java 21 虚拟线程吗?
java·人工智能·spring·ai·ai编程
知守观2 小时前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
深盾科技_Virbox2 小时前
换机或重装后软件许可怎么恢复:先核对哪四项
java·服务器·数据库
Zhuo1Joy2 小时前
中间件挂了怎么办:兜底的边界与取舍
java