首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java IO 工作机制深度解析:四大体系、同步阻塞模型、序列化原理与组合装饰模式

     編輯:Java 綜合教學

Java IO 工作机制深度解析

Java IO 类位于 java.io,分为字节流、字符流、文件、网络四大体系。本文梳理类继承结构、装饰器组合模式、同步/异步/阻塞/非阻塞概念辨析、序列化机制与实战代码。

四大体系与继承结构

体系抽象基类核心子类典型用途
字节流InputStream / OutputStreamFileInputStream、ByteArrayInputStream、ObjectInputStream二进制数据、对象序列化、网络字节流
字符流Reader / WriterFileReader、BufferedReader、InputStreamReader、OutputStreamWriter文本处理、编码转换
文件File路径操作、属性查询、目录遍历文件系统抽象
网络Socket / ServerSocketTCP 通信、InputStream/OutputStream 获取网络字节流

InputStream 继承体系 OutputStream 继承体系

装饰器组合模式:流的任意嵌套

// 字节流 → 字符流 → 缓冲 → 读取
InputStreamReader isr = new InputStreamReader(
    new FileInputStream("haha.txt"), "utf-8");

BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) { ... }
  • 所有流构造器均接受同类型父类参数,实现「俄罗斯套娃」式功能叠加
  • FileReader = InputStreamReader + FileInputStream(默认编码)
  • FileWriter = OutputStreamWriter + FileOutputStream

同步/异步 vs 阻塞/非阻塞

维度同步异步
定义发起调用 → 等待结果返回 → 继续发起调用 → 立即返回 → 回调/通知结果
比喻打电话发短信
可靠性高(结果确定)低(需额外机制保证)

Java 传统 IO(BIO)= **同步阻塞**;NIO = **同步非阻塞**(Selector 轮询);AIO (NIO.2) = **异步非阻塞**(CompletionHandler)。

序列化机制

  • 实现 Serializable 标记接口(无方法)
  • ObjectOutputStream.writeObject(obj) → 字节流(含类元数据、字段值、对象图引用追踪)
  • ObjectInputStream.readObject() → 反序列化,需向下转型
  • serialVersionUID 建议显式声明,防止版本不兼容 InvalidClassException
  • transient 字段跳过序列化

序列化实战代码

// 写
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serialize.txt"))) {
    oos.writeObject("start");
    oos.writeObject(new Person("luoxn28", 23));
    oos.writeObject(12);
}

// 读
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serialize.txt"))) {
    String s = (String) ois.readObject();
    Person p = (Person) ois.readObject();
    int n = (int) ois.readObject();
    System.out.println(s + " | " + p + " | " + n);
}

最佳实践

  1. 文本处理优先 BufferedReader/Writer + 指定编码
  2. 大文件拷贝用 FileChannel.transferTo() 零拷贝
  3. 序列化对象务必声明 serialVersionUID
  4. 网络通信考虑 Protobuf/Thrift/Avro 等高效二进制协议替代 Java 原生序列化
  5. 资源管理用 try-with-resources (JDK 7+)

参考资料

  • 《深入分析 Java I/O 的工作机制》
  • 《Java IO 系统》
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
维度阻塞非阻塞
定义CPU 等待慢操作完成CPU 去干别的事,完成后再处理
代价线程挂起、上下文切换轮询/回调复杂度、线程切换增加