RandomAccessFile 非流,实现 DataInput/DataOutput,支持**随机访问**(可读可写、可移动指针 `seek(pos)`),适合需定位修改的场景(如断点续传、修改文件中间内容)。但**不适合大批量顺序读写**,性能不如缓冲流。
| 类/接口 | 分类 | 核心能力 | 典型场景 |
|---|---|---|---|
File | 文件元数据 | 创建/删除/判断存在/重命名/目录遍历,**不读写内容** | 文件管理 |
FileWriter | 字符输出流 | 写文本,支持追加模式 new FileWriter(file, true) | 简单文本写入 |
FileReader | 字符输入流 | 读文本,**需配合 BufferedReader** 逐行高效读取 | 简单文本读取 |
BufferedReader/Writer | 缓冲字符流 | **文本首选**,按行读 readLine()、缓冲写 newLine() | 配置文件、日志、CSV |
BufferedInputStream/OutputStream | 缓冲字节流 | **二进制首选**,图片、视频、序列化对象读写 | 文件拷贝、资源下载 |
Files.newBufferedReader | NIO.2 (JDK7+) | 指定编码 Charset.forName("UTF-8"),返回 BufferedReader | 现代文本读取标准写法 |
Scanner | 扫描器 | 按正则分隔符 useDelimiter("\\s+") 切割,解析基本类型 | 控制台输入、简单文本解析 |
RandomAccessFile | 随机访问文件 | seek() 移动指针、read/write 基本类型、**支持读写同一文件** | 断点续传、随机修改、内存映射源 |
// "rw" 读写模式
try (RandomAccessFile raf = new RandomAccessFile("data.dat", "rw")) {
// 写基本类型
raf.writeInt(100);
raf.writeUTF("Hello");
// 移动指针到开头读取
raf.seek(0);
int i = raf.readInt();
String s = raf.readUTF();
// 获取/设置文件长度
long len = raf.length();
raf.setLength(200); // 截断或扩展
}
Files.newBufferedReader/Writer (JDK7+) 或 BufferedReader/Writer。BufferedInputStream/OutputStream。RandomAccessFile。FileChannel + MappedByteBuffer (内存映射)。Scanner。