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、多路复用、高并发网络编程
相关推荐
sleven fung10 小时前
llama-cpp-python 本地部署入门
开发语言·python·算法·llama
头歌实践平台10 小时前
C++面向对象 - 运算符重载的应用
开发语言·c++·算法
福大大架构师每日一题10 小时前
rust 1.96.0 更新:语言、编译器、Cargo、Rustdoc、兼容性全面升级,必看完整解读
android·开发语言·rust
思麟呀10 小时前
C++11并发编程:互斥锁
linux·开发语言·c++·windows
砍材农夫10 小时前
物联网实战:Spring Boot + Netty 搭建 MQTT | MQTT 设备模拟器
java·spring boot·后端·物联网·struts·spring·netty
城管不管10 小时前
Agent——001
android·java·数据库·llm·prompt
AC赳赳老秦10 小时前
OpenClaw批量任务队列优化:解决任务堆积、执行缓慢、优先级混乱问题
java·大数据·数据库·c++·自动化·php·openclaw
郭涤生10 小时前
C++ 各类数据的内存分区与读写性能详解
开发语言·c++
Pluchon10 小时前
萌萌技术分享笔记——Java综合项目
java·开发语言·笔记·git·github·mybatis·postman
j_xxx404_10 小时前
Linux 线程日志系统设计:从策略模式、RAII 到 pthread 线程安全与内核写入路径|附源码
linux·运维·服务器·开发语言·c++·人工智能·策略模式