Java基础-I/O与File
·
IO、File
File 类核心能力
- 一个目录就是一个
File对象,可包含其他文件和文件夹 - 常用方法:
isDirectory():判断是否为目录exists():检查文件/目录是否存在delete():删除文件或空目录listFiles():遍历目录下的所有文件/子目录
⚠️ 重要限制:
File类只能操作文件元信息(创建、删除、判断),不能读写文件内容!
字符流和字节流的区别及应用场景?
| 流类型 | 处理单位 | 适用场景 | 常用类 |
|---|---|---|---|
| 字节流 | byte(8位) | 二进制数据(图片、音频、视频、zip) | FileInputStream, FileOutputStream |
| 字符流 | char(16位) | 文本数据(自动处理编码,如 UTF-8) | FileReader, FileWriter, BufferedReader |
✅ 原则:文本用字符流,二进制用字节流
为什么用 BufferedReader 而不用直接 FileReader?
BufferedReader使用了内部缓冲区(默认 8KB)- 减少系统调用次数(每次读一大块,而不是一个字符一个字符读)
- 显著提高 I/O 效率
💡 面试加分:知道
BufferedWriter同理,且支持newLine()跨平台换行
如何读取大文件?
- 文本文件:用
BufferedReader按行读取(避免readAllLines()内存溢出) - 二进制文件:用
BufferedInputStream分块读取(如每次 4KB~64KB)
byte[] buffer = new byte[8192];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
⚠️ 切忌:用 Files.readAllBytes() 读超大文件(可能 OOM)
什么是序列化 & 反序列化?如何实现?
- 序列化:将 Java 对象 → 字节流(用于持久化、网络传输)
- 反序列化:字节流 → Java 对象
实现方式:
类实现 java.io.Serializable 接口(标记接口)
使用 ObjectOutputStream / ObjectInputStream
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.ser"))) {
oos.writeObject(new Student("张三", 20));
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student.ser"))) {
Student s = (Student) ois.readObject();
}
关键细节:
serialVersionUID:显式声明,避免类结构变更导致反序列化失败
transient:标记字段不参与序列化(如密码、临时缓存)
⚠️ 安全警告:不要反序列化不可信来源的数据(可能 RCE 攻击)
更多推荐


所有评论(0)