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 后回调,真正异步(高并发、高吞吐)
相关推荐
wuxinyan1232 小时前
Java面试题52:一文深入了解Kubernetes 核心资源对象
java·kubernetes·面试题
知识分享小能手2 小时前
R语言入门学习教程,从入门到精通,R语言传统绘图系统 - 完整知识点与案例代码(2)
开发语言·学习·r语言
SamDeepThinking2 小时前
秒杀下单,用户点一下按钮,后端要过六道关卡
java·后端·架构
代龙涛2 小时前
WordPress archive.php 分类与归档页面开发指南
开发语言·后端·php·wordpress
格林威2 小时前
面阵相机 vs 线阵相机:堡盟与大恒相机选型差异全解析 附C++ 实战演示
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
Sam_Deep_Thinking2 小时前
适合中小型企业的出口入口网关微服务
java·微服务·架构
xyq20242 小时前
相邻节点迭代器
开发语言
YSF2017_32 小时前
C语言15-makefile(2)——makefile的自定义变量及两个函数
c语言·开发语言
YaBingSec2 小时前
玄机靶场—Apache-druid(CVE-2021-25646) WP
java·开发语言·笔记·安全·php·apache