Java IO 流

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


一、核心设计思想

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

二、IO 流体系分类

1. 按数据传输方向划分

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

2. 按数据处理单位划分

  • 字节流(Byte Stream)

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

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

3. 按功能与角色划分

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

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


三、核心基类与常用实现

字节流体系

  • 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、多路复用、高并发网络编程
相关推荐
mqiqe36 分钟前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
lzhdim38 分钟前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
脉动数据行情42 分钟前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
爱学习的小邓同学1 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
zx_741484812 小时前
【Python 入门】面向对象基础:类、对象、成员变量与构造方法
开发语言·python
月华路3 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
liangshanbo12153 小时前
虚拟列表深度面试题整理
java·开发语言·前端
ZISHU_9873 小时前
用 TLabel 给 SynTouch BioTac 数据做语义标注:从原始信号到结构化标注
开发语言·人工智能·python·数据·机器人触觉
略略略咯咯3 小时前
C#Unity
开发语言·unity·c#
gugucoding3 小时前
59. 【Java】Spring Boot 入门:第一个 Web 应用
java·开发语言·spring boot