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 攻击)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐