Java基础学习(十三):IO流基础

目录

核心概念

IO :Input/Output,程序与外部(文件、网络、控制台)的数据传输。
流(Stream) :单向、有序、字节 / 字符序列,像水管:

  • 输入流:外部 → 程序(读)
  • 输出流:程序 → 外部(写)

设计模式 :装饰者模式 ------ 节点流(如FileInputStream)被处理流(如BufferedInputStream)包装,动态增功能。
包 :java.io
特点:

  • 顺序访问:数据按顺序读取/写入,不能随机访问
  • 单向流动:输入流用于读取数据,输出流用于写入数据
  • 基于字节或字符:支持原始字节和字符数据
  • 可关闭性:流操作涉及系统资源,使用后必须关闭,否则会导致资源泄漏

IO流分类

按数据单位(最核心)

  • 字节流(Byte Stream) :处理二进制数据
    • 基类:InputStream(输入)、OutputStream(输出)
    • 单位:1 byte(8 bit)
    • 用途:所有类型数据(文本、图片、视频、音频、压缩包)
  • 字符流(Character Stream)
    • 基类:Reader(输入)、Writer(输出)
    • 单位:1 char(2 byte,Unicode)
    • 用途:纯文本 (.txt/.java/.md),自动处理编码(UTF-8/GBK),避免中文乱码

按流向

  • 输入流 :InputStream/Reader 子类
  • 输出流 :OutputStream/Writer 子类

按角色(节点 / 处理)

  • 节点流(低级流) :直接对接数据源(文件、内存),如FileInputStream、FileReader
  • 处理流(高级流) :包装节点流 ,增强功能(缓冲、序列化、过滤),如BufferedReader、ObjectOutputStream

按功能分类

  • 文件流 :直接操作文件的流,如FileInputStream
  • 缓冲流 :提供缓冲功能,提升读写效率,如BufferedReader
  • 转换流 :实现字节流与字符流的转换,如InputStreamReader
  • 数据流 :读写基本数据类型,如DataInputStream
  • 对象流 :实现对象的序列化与反序列化,如ObjectInputStream
  • 打印流 :方便输出数据,如PrintStream、PrintWriter

四大抽象基类

InputStream(输入)、OutputStream(输出)
Reader(输入)、Writer(输出)

大基类均为抽象类,不能直接 new,只能用子类。

字节流体系核心类继承关系如下:

bash 复制代码
InputStream
├─ FileInputStream(文件输入流)
├─ BufferedInputStream(缓冲输入流)
├─ DataInputStream(数据输入流)
├─ ObjectInputStream(对象输入流)
├─ ByteArrayInputStream(字节数组输入流)
└─ ...

OutputStream
├─ FileOutputStream(文件输出流)
├─ BufferedOutputStream(缓冲输出流)
├─ DataOutputStream(数据输出流)
├─ ObjectOutputStream(对象输出流)
├─ ByteArrayOutputStream(字节数组输出流)
└─ ...

// 字符流体系
Reader
├─ FileReader(文件读取器)
├─ BufferedReader(缓冲读取器)
├─ InputStreamReader(字节转字符输入流)
├─ CharArrayReader(字符数组读取器)
└─ ...

Writer
├─ FileWriter(文件写入器)
├─ BufferedWriter(缓冲写入器)
├─ OutputStreamWriter(字符转字节输出流)
├─ CharArrayWriter(字符数组写入器)
└─ ...

常用流类与用途

  1. 字节流常用子类
  • 节点流
    • FileInputStream:读文件(字节)
    • FileOutputStream:写文件(字节)
    • ByteArrayInputStream/ByteArrayOutputStream:内存字节数组读写
  • 处理流
    • BufferedInputStream/BufferedOutputStream:缓冲字节流,提高效率(默认 8KB 缓冲区)
    • DataInputStream/DataOutputStream:读写基本数据类型(int/double/boolean)
    • ObjectInputStream/ObjectOutputStream:对象序列化 / 反序列化
  1. 字符流常用子类
  • 节点流
    • FileReader:读文本文件(字符)
    • FileWriter:写文本文件(字符)
  • 处理流
    • BufferedReader/BufferedWriter:缓冲字符流 ,高效,支持readLine()/newLine()
    • InputStreamReader/OutputStreamWriter:字节→字符转换流,指定编码(如 UTF-8)

关键注意事项

  1. 流必须关闭 :用try-with-resources(自动关流,推荐)或finally手动关流,避免资源泄漏。
  2. 字节流与字符流选择:
    • 非文本(图片 / 视频 / 压缩包)→ 字节流
    • 纯文本 → 字符流(指定编码,防乱码)
  3. 缓冲流必用 :直接用节点流效率极低 ,包装Buffered系列缓冲流,减少磁盘 IO 次数。
  4. 序列化:
    • 实体类必须实现Serializable接口
    • 显式定义serialVersionUID,避免类修改后反序列化失败
    • transient修饰的字段不参与序列化

IO 模型演进

  • BIO(Blocking IO,传统 IO) :阻塞 + 同步,一个连接一个线程,并发低(适合小连接数)
  • NIO(New IO/Non-blocking IO,JDK1.4+) :非阻塞 + 同步 + 多路复用 ,单线程管理多连接(高并发),核心:Channel(双向通道)、Buffer(缓冲区)、Selector(选择器)
  • AIO(Asynchronous IO,NIO.2,JDK7+) :异步 + 非阻塞,内核完成 IO 后回调,真正异步(高并发、高吞吐)
相关推荐
沫璃染墨1 分钟前
《从零入门Linux系统篇(五十一):线程篇·四——pthread线程库详解:从线程创建到终止与分离》
linux·运维·服务器·开发语言·c++·系统架构·线程
今年下半年4 分钟前
【网站连通性检测】java项目telnet、curl命令的使用
java·curl·telnet
摇滚侠5 分钟前
《Spring Boot 3:高级与架构设计》第 2 章 IOC 容器的高级机制 编程式驱动 IOC 阅读笔记 7
java·spring boot·笔记
only-lucky8 分钟前
QML深入学习七(MVC模块)
学习·mvc
IT枫斗者枫哥9 分钟前
UPDATE影响0行,接口却返回成功:把版本冲突接回业务
java·后端
霸道流氓气质16 分钟前
AI应用成本优化完全指南:Token压缩、语义缓存与模型路由的Java生产级实战
java·人工智能·缓存
2401_8501220423 分钟前
高温耐油热缩套管选型:材料、温度和油液要匹配
经验分享·笔记·科技·学习
mmm.c24 分钟前
Redis 两级缓存 + Pub/Sub 广播:一次为抗高并发做的缓存改造
java
yexianglunbai25 分钟前
中间件(Middleware)详解:概念、作用与实战
java·开发语言·中间件
叶总没有会27 分钟前
OpenFeign
java·开发语言·springcloud·openfeign