JAVA IO流笔记

一、IO流核心概念与分类

  1. 流的定义

流是数据传输通道,负责程序内存与外部设备(文件、网络、外设)之间的数据搬运。

  1. 三大分类方式

(1)按数据传输方向(以 JVM 内存为基准)

• 输入流(读):外部设备的数据 → 程序内存

• 输出流(写):程序内存的数据 → 外部设备

(2)按数据传输单位

• 字节流:以字节为单位传输,万能流,可处理所有文件(文本、视频、音频、图片、压缩包等)

• 字符流:以字符为单位传输,仅适用于纯文本文件

纯文本文件定义:记事本打开不乱码、内容完整的文件

常见:txt、java、html、c、css

非文本:class、mp3、mp4、jpg、ppt、zip

(3)按流的功能层级

• 节点流:基础原生流,只具备最基本的读写能力,直接对接文件

• 包装/过滤流:基于节点流增强功能(提速、缓冲、对象读写、按行读取等)

二、字节流体系

  1. 字节流顶层抽象父类

均为抽象类,不能直接实例化

• InputStream:所有字节输入流父类(读)

• OutputStream:所有字节输出流父类(写)

  1. 文件字节节点流

(1)FileOutputStream 文件字节输出流(写文件)

构造方式

  1. 绝对路径创建:指定磁盘完整路径,文件夹不存在报错,文件不存在自动创建

  2. 相对路径创建:默认在当前项目根目录查找、创建文件

  3. 续写/覆盖构造:第二个布尔参数控制写入模式

◦ 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. 字节增强过滤流

(1)缓冲字节流

BufferedInputStream / BufferedOutputStream

• 内置缓冲区,大幅减少磁盘IO次数,提升读写性能

• flush():刷新缓冲区,数据强制写入文件,流可继续使用

• close():关闭前自动执行 flush

(2)数据字节流

DataInputStream / DataOutputStream

支持直接读写 八大基本数据类型,无需手动转换字节数组。

(3)对象字节流(序列化核心)

ObjectInputStream / ObjectOutputStream

可直接读写Java对象,是对象序列化的核心流。

核心考点:对象序列化

  1. 序列化:将内存对象转为流数据,实现文件存储/网络传输

  2. 序列化必备条件:实体类必须实现 Serializable 标记接口

  3. transient 修饰的成员变量 不参与序列化

  4. 自定义对象的成员属性若为自定义类型,该类型也必须实现序列化接口

  5. 集合本身支持序列化,但集合内自定义对象仍需序列化

  6. 文件读取完毕会抛出 EOFException 作为结束标记

三、字符编码体系

  1. 常见编码集

• ISO8859-1:西欧编码,单字节存储,不支持中文

• GB2312 / GBK / GB18030:中文编码,相互兼容,GBK支持汉字更广

• Big5:繁体中文编码

• UTF-8:通用万国码,动态1~3字节,汉字占2~3字节

  1. 编码与解码

• 编码:字符 → 二进制字节

• 解码:二进制字节 → 字符

• 编码解码格式不一致 → 必然乱码

四、字符流体系(只操作文本文件)

  1. 字符流顶层抽象父类

• Reader:所有字符输入流父类

• Writer:所有字符输出流父类

  1. 文件字符节点流

FileReader / FileWriter

专门用于文本文件读写,用法与字节流高度相似,操作单位为字符

• 支持单字符读写、字符数组读写、整行文本读写

  1. 字符增强过滤流

(1)BufferedReader

核心独有方法:readLine() 读取一整行文本,读到末尾返回 null,文本读取首选。

(2)PrintWriter

• 支持八大基本类型、对象打印

• print() 不换行、println() 自动换行

• 打印对象时 自动调用 toString()

重要区别

• ObjectOutputStream.writeObject():序列化对象,必须实现Serializable

• PrintWriter.println(对象):只打印对象字符串信息,无需序列化

  1. 转换流(桥接流、开发重点)

InputStreamReader / OutputStreamWriter

核心作用

  1. 字节流转为字符流,充当两种流的桥梁

  2. 手动指定读写编码集,解决乱码问题

标准开发使用流程

  1. 创建基础字节节点流

  2. 包裹转换流并指定编码格式

  3. 外层包装缓冲/打印流增强功能

  4. 执行读写操作

  5. 只关闭最外层流即可

五、File 文件操作类

  1. File类与IO流的本质区别

• IO流:操作文件内容(读、写数据)

• File类:操作文件本身(创建、删除、重命名、获取路径、判断文件类型)

  1. 常用核心方法

• getName():获取文件名(含后缀)

• getAbsolutePath():获取文件绝对路径(开发常用)

相关推荐
星夜离尘562 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi2 小时前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
地平线开发者2 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet3 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
Felven3 小时前
C. Brr Brrr Patapim
c语言·开发语言
赤生云电竞3 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
路溪非溪4 小时前
python标准库使用总结
开发语言·python
青少儿编程课堂5 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
SomeOtherTime6 小时前
Rust 面向对象介绍(AI回答)
开发语言·python·rust