Java IO 流

Java IO(Input/Output)流是 Java 语言中实现数据输入与输出的核心 API 体系,基于 ** 流(Stream)** 抽象模型,屏蔽底层硬件差异,为程序与外部设备(文件、网络、内存、管道等)之间的数据传输提供统一、标准的操作接口,是文件操作、网络通信、数据序列化、日志处理等场景的基础技术支撑。


一、核心设计思想

  1. 流抽象 将数据传输抽象为数据流,数据以连续字节 / 字符序列形式顺序传输。
  2. 单向传输流分为输入流与输出流,方向固定,不可反向操作。
  3. 装饰器模式通过包装流对基础节点流进行功能增强,实现灵活组合与扩展。
  4. 平台无关统一接口封装操作系统差异,一次编写多平台运行。

二、IO 流体系分类

1. 按数据传输方向划分

  • 输入流(Input):从外部设备读取数据到程序内存
  • 输出流(Output):将程序内存数据写入外部设备

2. 按数据处理单位划分

  • 字节流(Byte Stream)

    • 以 byte(8 位) 为基本处理单位
    • 顶层父类:InputStream、OutputStream
    • 适用:图片、音频、视频、压缩包、二进制文件等所有类型数据
  • 字符流(Character Stream)

    • 以 char(16 位) 为基本处理单位
    • 顶层父类:Reader、Writer
    • 内置编码转换,专为文本文件设计

3. 按功能与角色划分

  • 节点流(低级流) 直接与数据源 / 目的地连接,如 FileInputStream、FileReader。

  • 处理流(高级流 / 包装流) 对节点流进行包装,增强功能:缓冲、序列化、对象读写、格式化等。典型:BufferedInputStream、ObjectOutputStream、PrintWriter。


三、核心基类与常用实现

字节流体系

  • InputStream(抽象父类)

    • FileInputStream:文件字节输入
    • ByteArrayInputStream:内存字节数组输入
    • BufferedInputStream:缓冲字节输入
    • ObjectInputStream:对象反序列化
  • OutputStream(抽象父类)

    • FileOutputStream:文件字节输出
    • ByteArrayOutputStream:内存字节数组输出
    • BufferedOutputStream:缓冲字节输出
    • ObjectOutputStream:对象序列化
    • PrintStream:格式化打印输出(如 System.out)

字符流体系

  • Reader(抽象父类)

    • FileReader:文件字符输入
    • BufferedReader:缓冲字符输入(支持 readLine())
    • InputStreamReader:字节转字符(编码转换核心)
  • Writer(抽象父类)

    • FileWriter:文件字符输出
    • BufferedWriter:缓冲字符输出
    • OutputStreamWriter:字符转字节
    • PrintWriter:格式化字符输出

四、关键特性与机制

  1. 顺序访问 数据只能从头至尾顺序读写,不支持随机定位(RandomAccessFile 除外)。

  2. 缓冲机制缓冲流减少频繁 IO 操作,显著提升读写效率,是高性能 IO 的标配。

  3. 编码支持 转换流 InputStreamReader/OutputStreamWriter 可指定 UTF-8、GBK 等编码,解决中文乱码问题。

  4. 资源关闭 流属于操作系统资源,使用完毕必须关闭。JDK7+ 推荐使用 try-with-resources 自动关闭实现 AutoCloseable 的流。

  5. 异常体系 所有 IO 操作均抛出受检异常 IOException,必须显式捕获或抛出。


五、IO 流的典型应用场景

  • 文件读写、复制、移动、删除
  • 网络 Socket 数据收发
  • 对象序列化与持久化存储
  • 日志记录与文本解析
  • 图片、音视频等二进制数据处理
  • 数据导入导出(Excel、CSV、TXT)

六、Java IO 与 NIO 区别(简要)

  • 传统 IO:面向流、阻塞 IO、单向传输、数据处理简单
  • NIO:面向缓冲区、非阻塞 IO、多路复用、高并发网络编程
相关推荐
ZWZhangYu3 分钟前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
小熊恋旧7 分钟前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合8 分钟前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J8 分钟前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
小羊没烦恼!28 分钟前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
will_net29 分钟前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央1 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>1 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
Fuyo_11192 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
努力努力再努力wz2 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua