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 次数,提升效率
相关推荐
清水白石0081 天前
Python 弱引用深度解析——让缓存不再成为内存泄漏的温床
java·python·缓存
zzb15801 天前
RAG from Scratch-优化-routing
java·前端·网络·人工智能·后端·python·mybatis
深蓝轨迹1 天前
IDEA 中 Spring Boot 配置文件的自动提示消失(无法扫描配置文件)的完整解决方案
java·spring boot·intellij-idea
杀神lwz1 天前
Java Json压缩工具类
java·json
虾..1 天前
Linux 基于TCP实现服务端客户端通信(线程池)
java·网络协议·tcp/ip
前端小雪的博客.1 天前
【Java 基础】变量全解:定义、命名规范、作用域与常量(附代码示例+面试题)
java·作用域·java基础·java入门·变量·常量·java面试题
mldlds1 天前
【异常解决】Unable to start embedded Tomcat Nacos 启动报错
java·tomcat
代码探秘者1 天前
【Java】final、finally、finalize 区别
java·开发语言
代码探秘者1 天前
【Java】浅拷贝 VS 深拷贝:核心差异 + 实现方式 + 避坑指南
java·开发语言
盐水冰1 天前
【Redis】学习(3)Redis的Java客户端
java·redis·学习