Java中的Java I/O流体系详解
字数 1432 2025-11-08 20:56:49

Java中的Java I/O流体系详解

描述
Java I/O流是Java中处理输入输出的核心机制,提供了读写各种数据源(文件、网络、内存等)的统一抽象。I/O流体系庞大而复杂,理解其层次结构和设计思想对编写高效、正确的I/O程序至关重要。

知识要点讲解

1. I/O流的基本概念与分类

  • 流(Stream):数据流动的抽象概念,数据从源(Source)流向目标(Sink)
  • 按流向分类
    • 输入流(InputStream/Reader):从数据源读取数据到程序
    • 输出流(OutputStream/Writer):从程序写出数据到目标
  • 按数据类型分类
    • 字节流:以字节(8bit)为单位,可处理所有类型数据
    • 字符流:以字符(16bit)为单位,专门处理文本数据,支持字符编码

2. 字节流体系结构

  • 顶层抽象类
    • InputStream:所有字节输入流的父类
    • OutputStream:所有字节输出流的父类
  • 核心方法
    // InputStream
    int read() // 读取单个字节
    int read(byte[] b) // 读取到字节数组
    void close() // 关闭流
    
    // OutputStream  
    void write(int b) // 写入单个字节
    void write(byte[] b) // 写入字节数组
    void flush() // 刷新缓冲区
    void close() // 关闭流
    

3. 字符流体系结构

  • 设计目的:解决字节流处理文本时的编码问题
  • 顶层抽象类
    • Reader:所有字符输入流的父类
    • Writer:所有字符输出流的父类
  • 核心方法
    // Reader
    int read() // 读取单个字符
    int read(char[] cbuf) // 读取到字符数组
    
    // Writer
    void write(int c) // 写入单个字符
    void write(char[] cbuf) // 写入字符数组
    void write(String str) // 写入字符串
    

4. 装饰器模式在I/O流中的应用

  • 设计思想:通过组合方式动态扩展功能
  • 工作方式:装饰器类包裹被装饰的流对象
  • 典型装饰器
    • BufferedInputStream/BufferedOutputStream:提供缓冲功能
    • DataInputStream/DataOutputStream:支持基本数据类型读写
    • BufferedReader/BufferedWriter:字符流的缓冲功能
    • PrintStream/PrintWriter:格式化输出

5. 文件I/O操作详解

  • 文件字节流
    // 文件复制示例
    try (FileInputStream fis = new FileInputStream("source.txt");
         FileOutputStream fos = new FileOutputStream("target.txt")) {
        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer)) != -1) {
            fos.write(buffer, 0, length);
        }
    }
    
  • 文件字符流
    // 文本文件读取示例(带缓冲)
    try (BufferedReader reader = new BufferedReader(new FileReader("text.txt"))) {
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    }
    

6. 转换流:字节流与字符流的桥梁

  • InputStreamReader:将字节输入流转换为字符输入流
  • OutputStreamWriter:将字符输出流转换为字节输出流
  • 编码处理
    // 指定字符编码读取文件
    Reader reader = new InputStreamReader(
        new FileInputStream("file.txt"), "UTF-8");
    

7. 对象序列化流

  • ObjectInputStream/ObjectOutputStream:实现Java对象序列化
  • 序列化要求:实现Serializable接口
  • transient关键字:标记不被序列化的字段
  • serialVersionUID:控制版本兼容性

8. 其他重要流类

  • 字节数组流ByteArrayInputStream/ByteArrayOutputStream
  • 数据流DataInputStream/DataOutputStream(读写基本数据类型)
  • 打印流PrintStream/PrintWriter(格式化输出)
  • 管道流PipedInputStream/PipedOutputStream(线程间通信)

9. NIO.2中的Files类(Java 7+)

  • 简化文件操作:提供静态方法完成常见文件任务
  • 示例代码
    // 读取所有行
    List<String> lines = Files.readAllLines(Paths.get("file.txt"));
    // 写入文件
    Files.write(Paths.get("output.txt"), content.getBytes());
    

10. 最佳实践与注意事项

  • 使用try-with-resources:自动关闭资源,避免资源泄漏
  • 合理使用缓冲:减少I/O操作次数,提升性能
  • 注意字符编码:明确指定字符集,避免乱码问题
  • 大文件处理:使用缓冲和分块读写,避免内存溢出

通过理解Java I/O流的层次结构和设计模式,可以更灵活地选择适合的流类来处理不同的I/O场景,写出高效可靠的I/O代码。

Java中的Java I/O流体系详解 描述 Java I/O流是Java中处理输入输出的核心机制,提供了读写各种数据源(文件、网络、内存等)的统一抽象。I/O流体系庞大而复杂,理解其层次结构和设计思想对编写高效、正确的I/O程序至关重要。 知识要点讲解 1. I/O流的基本概念与分类 流(Stream) :数据流动的抽象概念,数据从源(Source)流向目标(Sink) 按流向分类 : 输入流(InputStream/Reader) :从数据源读取数据到程序 输出流(OutputStream/Writer) :从程序写出数据到目标 按数据类型分类 : 字节流 :以字节(8bit)为单位,可处理所有类型数据 字符流 :以字符(16bit)为单位,专门处理文本数据,支持字符编码 2. 字节流体系结构 顶层抽象类 : InputStream :所有字节输入流的父类 OutputStream :所有字节输出流的父类 核心方法 : 3. 字符流体系结构 设计目的 :解决字节流处理文本时的编码问题 顶层抽象类 : Reader :所有字符输入流的父类 Writer :所有字符输出流的父类 核心方法 : 4. 装饰器模式在I/O流中的应用 设计思想 :通过组合方式动态扩展功能 工作方式 :装饰器类包裹被装饰的流对象 典型装饰器 : BufferedInputStream/BufferedOutputStream :提供缓冲功能 DataInputStream/DataOutputStream :支持基本数据类型读写 BufferedReader/BufferedWriter :字符流的缓冲功能 PrintStream/PrintWriter :格式化输出 5. 文件I/O操作详解 文件字节流 : 文件字符流 : 6. 转换流:字节流与字符流的桥梁 InputStreamReader :将字节输入流转换为字符输入流 OutputStreamWriter :将字符输出流转换为字节输出流 编码处理 : 7. 对象序列化流 ObjectInputStream/ObjectOutputStream :实现Java对象序列化 序列化要求 :实现 Serializable 接口 transient关键字 :标记不被序列化的字段 serialVersionUID :控制版本兼容性 8. 其他重要流类 字节数组流 : ByteArrayInputStream/ByteArrayOutputStream 数据流 : DataInputStream/DataOutputStream (读写基本数据类型) 打印流 : PrintStream/PrintWriter (格式化输出) 管道流 : PipedInputStream/PipedOutputStream (线程间通信) 9. NIO.2中的Files类(Java 7+) 简化文件操作 :提供静态方法完成常见文件任务 示例代码 : 10. 最佳实践与注意事项 使用try-with-resources :自动关闭资源,避免资源泄漏 合理使用缓冲 :减少I/O操作次数,提升性能 注意字符编码 :明确指定字符集,避免乱码问题 大文件处理 :使用缓冲和分块读写,避免内存溢出 通过理解Java I/O流的层次结构和设计模式,可以更灵活地选择适合的流类来处理不同的I/O场景,写出高效可靠的I/O代码。