一、IO流核心概念与分类
- 流的定义
流是数据传输通道,负责程序内存与外部设备(文件、网络、外设)之间的数据搬运。
- 三大分类方式
(1)按数据传输方向(以 JVM 内存为基准)
• 输入流(读):外部设备的数据 → 程序内存
• 输出流(写):程序内存的数据 → 外部设备
(2)按数据传输单位
• 字节流:以字节为单位传输,万能流,可处理所有文件(文本、视频、音频、图片、压缩包等)
• 字符流:以字符为单位传输,仅适用于纯文本文件
纯文本文件定义:记事本打开不乱码、内容完整的文件
常见:txt、java、html、c、css
非文本:class、mp3、mp4、jpg、ppt、zip
(3)按流的功能层级
• 节点流:基础原生流,只具备最基本的读写能力,直接对接文件
• 包装/过滤流:基于节点流增强功能(提速、缓冲、对象读写、按行读取等)
二、字节流体系
- 字节流顶层抽象父类
均为抽象类,不能直接实例化
• InputStream:所有字节输入流父类(读)
• OutputStream:所有字节输出流父类(写)
- 文件字节节点流
(1)FileOutputStream 文件字节输出流(写文件)
构造方式
-
绝对路径创建:指定磁盘完整路径,文件夹不存在报错,文件不存在自动创建
-
相对路径创建:默认在当前项目根目录查找、创建文件
-
续写/覆盖构造:第二个布尔参数控制写入模式
◦ true:追加写入,保留原内容
◦ false:覆盖写入,清空原内容重写
常用写入方法
• write(int b):写入单个字节
• write(byte\[\] b):写入整个字节数组
• write(byte\[\] b, off, len):写入数组指定区间内容
• close():关闭IO资源(必须执行)
(2)FileInputStream 文件字节输入流(读文件)
重要特点
文件不存在直接抛异常,不会自动创建文件。
常用读取方法
• read():读取单个字节,读到文件末尾返回 -1
• read(byte\[\] b):批量读取,返回实际读取字节数,末尾返回-1
• read(byte\[\] b, off, len):限定读取长度与数组存储位置
文件拷贝原理:字节输入流读取文件 → 字节输出流写出文件(上传、下载底层原理)
- 字节增强过滤流
(1)缓冲字节流
BufferedInputStream / BufferedOutputStream
• 内置缓冲区,大幅减少磁盘IO次数,提升读写性能
• flush():刷新缓冲区,数据强制写入文件,流可继续使用
• close():关闭前自动执行 flush
(2)数据字节流
DataInputStream / DataOutputStream
支持直接读写 八大基本数据类型,无需手动转换字节数组。
(3)对象字节流(序列化核心)
ObjectInputStream / ObjectOutputStream
可直接读写Java对象,是对象序列化的核心流。
核心考点:对象序列化
-
序列化:将内存对象转为流数据,实现文件存储/网络传输
-
序列化必备条件:实体类必须实现 Serializable 标记接口
-
transient 修饰的成员变量 不参与序列化
-
自定义对象的成员属性若为自定义类型,该类型也必须实现序列化接口
-
集合本身支持序列化,但集合内自定义对象仍需序列化
-
文件读取完毕会抛出 EOFException 作为结束标记
三、字符编码体系
- 常见编码集
• ISO8859-1:西欧编码,单字节存储,不支持中文
• GB2312 / GBK / GB18030:中文编码,相互兼容,GBK支持汉字更广
• Big5:繁体中文编码
• UTF-8:通用万国码,动态1~3字节,汉字占2~3字节
- 编码与解码
• 编码:字符 → 二进制字节
• 解码:二进制字节 → 字符
• 编码解码格式不一致 → 必然乱码
四、字符流体系(只操作文本文件)
- 字符流顶层抽象父类
• Reader:所有字符输入流父类
• Writer:所有字符输出流父类
- 文件字符节点流
FileReader / FileWriter
专门用于文本文件读写,用法与字节流高度相似,操作单位为字符
• 支持单字符读写、字符数组读写、整行文本读写
- 字符增强过滤流
(1)BufferedReader
核心独有方法:readLine() 读取一整行文本,读到末尾返回 null,文本读取首选。
(2)PrintWriter
• 支持八大基本类型、对象打印
• print() 不换行、println() 自动换行
• 打印对象时 自动调用 toString()
重要区别
• ObjectOutputStream.writeObject():序列化对象,必须实现Serializable
• PrintWriter.println(对象):只打印对象字符串信息,无需序列化
- 转换流(桥接流、开发重点)
InputStreamReader / OutputStreamWriter
核心作用
-
字节流转为字符流,充当两种流的桥梁
-
手动指定读写编码集,解决乱码问题
标准开发使用流程
-
创建基础字节节点流
-
包裹转换流并指定编码格式
-
外层包装缓冲/打印流增强功能
-
执行读写操作
-
只关闭最外层流即可
五、File 文件操作类
- File类与IO流的本质区别
• IO流:操作文件内容(读、写数据)
• File类:操作文件本身(创建、删除、重命名、获取路径、判断文件类型)
- 常用核心方法
• getName():获取文件名(含后缀)
• getAbsolutePath():获取文件绝对路径(开发常用)