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 后回调,真正异步(高并发、高吞吐)
相关推荐
程序员黑豆5 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年6 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅6 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148116 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
小席是个热心肠7 小时前
AI相关的自我学习
java·人工智能·学习
知无不研9 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
数智化管理手记9 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
何事误红尘9 小时前
Mqtt学习笔记(一):Mosquitto服务器搭建、MQTTX安装测试
学习
cfm_29149 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
青山是哪个青山9 小时前
LangChain 学习笔记(三):LangSmith 调试与监控
笔记·学习·langchain