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 次数,提升效率
相关推荐
吴名氏.1 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
.痞老板.2 小时前
java ee--多线程(进阶)
java·java-ee
深入云栈3 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
wang_shu_mo_ran4 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis
量化分析码农6 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
猫猫不是喵喵.6 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
瑞雪兆丰年兮6 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
曲径海盗6 小时前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
Cosolar7 小时前
极简智库:快速搭建你的开源项目教程阅读平台,让 docs/ 目录被更多人看见
java·架构·github
nice_lcj5207 小时前
【从零理解 Spring AI · 16】Agent 与工作流:什么该写死,什么该让模型决定
java·人工智能·后端·spring ai·ai应用开发