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 子类

按角色(节点 / 处理)

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

按功能分类

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

四大抽象基类

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 后回调,真正异步(高并发、高吞吐)
相关推荐
凉、介2 小时前
Armv8-A virtualization 笔记 (二)
笔记·学习·嵌入式·arm·gic
踩着两条虫3 小时前
「AI + 低代码」的可视化设计器
开发语言·前端·低代码·设计模式·架构
JoneBB3 小时前
ABAP Webservice连接
运维·开发语言·数据库·学习
budingxiaomoli3 小时前
Spring IoC &DI
java·spring·ioc·di
Spider Cat 蜘蛛猫3 小时前
Springboot SSO系统设计文档
java·spring boot·后端
未若君雅裁3 小时前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
即使再小的船也能远航3 小时前
【Python】安装
开发语言·python
学习中.........3 小时前
从扰动函数的变化,感受红黑树带来的性能提升
java
Irissgwe3 小时前
类与对象(三)
开发语言·c++·类和对象·友元
嵌入式小企鹅4 小时前
UiPath推出AI编程“总指挥台”,SiFive发布RISC-V第三代猛兽
人工智能·学习·google·程序员·ai编程·risc-v·开源工具