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、多路复用、高并发网络编程
相关推荐
Lyyaoo.2 小时前
【JAVA基础面经】JVM的内存模型
java·开发语言·jvm
杨凯凡2 小时前
【017】泛型与通配符:API 设计里怎么用省心
java·开发语言
IT利刃出鞘2 小时前
Spring工具类--ObjectUtils的使用
java·后端·spring
MY_TEUCK8 小时前
Sealos 平台部署实战指南:结合 Cursor 与版本发布流程
java·人工智能·学习·aigc
2401_873479408 小时前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
我爱cope9 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python9 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
朝新_9 小时前
【Spring AI 】图像与语音模型实战
java·人工智能·spring
RH23121110 小时前
2026.4.16Linux 管道
java·linux·服务器
zmsofts10 小时前
java面试必问13:MyBatis 一级缓存、二级缓存:从原理到脏数据,一篇讲透
java·面试·mybatis