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、多路复用、高并发网络编程
相关推荐
酉鬼女又兒4 小时前
零基础快速入门前端CSS Transform 与动画核心知识点及蓝桥杯 Web 应用开发考点解析(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·css·职场和发展·蓝桥杯·html
山川行4 小时前
Python快速闯关8:内置函数
java·开发语言·前端·笔记·python·学习·visual studio
charlie1145141914 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(2) —— HAL 库获取、启动文件坑位与目录搭建
linux·开发语言·c++·stm32·单片机·学习·嵌入式
Java基基4 小时前
sdkman 一键切换 JDK 版本管理工具
java·开发语言·sdkman
美好的事情能不能发生在我身上4 小时前
Jmeter压测遇到的问题
java·分布式·jmeter
春日见4 小时前
GIT操作大全(个人开发与公司开发)
开发语言·驱动开发·git·matlab·docker·计算机外设·个人开发
云烟成雨TD4 小时前
Spring AI 1.x 系列【14】三月双版本连发!Spring AI 最新功能全掌握
java·人工智能·spring
XiYang-DING4 小时前
【Java SE】var关键字
java·开发语言
还是大剑师兰特4 小时前
将 Utils.js 挂载为全局(window.Utils.xx)完整配置方案
开发语言·javascript·ecmascript