RandomAccessFile是Java中唯一支持文件随机读写的IO类,直接继承Object,通过seek()定位文件指针实现任意位置读写,支持r/rw/rws/rwd四种模式,提供readInt()/writeUTF()等基本类型读写方法。

RandomAccessFile 是 Java 中唯一支持文件随机读写的 IO 类,它既不是 InputStream/OutputStream 的子类,也不是 Reader/Writer 的子类,而是直接继承自 Object,内部封装了文件指针(file pointer),允许在文件任意位置进行读写操作。
一、创建 RandomAccessFile 对象并理解访问模式
构造方法有两个参数:文件路径(或 File 对象)和访问模式字符串:
- "r":只读模式,文件必须存在,否则抛出 FileNotFoundException
- "rw":读写模式,文件不存在则创建;存在则保留原内容,指针初始在开头
- "rws":同 "rw",但每次写入都强制同步到磁盘(含元数据)
- "rwd":同 "rw",但每次写入只同步内容(不保证目录更新)
示例:
RandomAccessFile raf = new RandomAccessFile("data.bin", "rw");
二、控制文件指针位置实现“随机”读写
关键在于 seek(long pos) 方法——它把文件指针移动到指定字节偏移量(从 0 开始)。之后的读写都从此位置开始。
立即学习“Java免费学习笔记(深入)”;
- getFilePointer():获取当前指针位置
- length():获取文件总字节数
- 指针可超出当前文件长度:若在末尾后写入,中间自动补 0(稀疏文件行为)
例如,跳转到第 100 字节处写入一个 int(4 字节):
raf.seek(100); // 定位 raf.writeInt(12345); // 写入 4 字节,指针自动移到 104
三、常用数据类型读写方法(注意字节序固定为大端)
RandomAccessFile 提供了与 DataInputStream/DataOutputStream 兼容的读写方法,所有基本类型均按固定格式处理:
- writeInt(int) / readInt() —— 写/读 4 字节 int(big-endian)
- writeUTF(String) / readUTF() —— 按修改版 UTF-8 编码(先写 2 字节长度)
- writeDouble(double) / readDouble() —— IEEE 754 双精度
- writeBytes(String) / readLine() —— 按字节写、按行读(readLine 已过时,仅用于 ASCII 行)
⚠️ 注意:readLine() 不推荐用于非 ASCII 文本,且无法准确还原换行符;建议用 writeUTF + readUTF 存取字符串。
四、典型使用场景与注意事项
- 适合结构化二进制文件,如日志索引、数据库页、配置块等需要频繁跳转修改的场景
- 不适用于超大文件的全量扫描(此时 NIO 的 MappedByteBuffer 更高效)
- 多线程访问需自行加锁,RandomAccessFile 本身不保证线程安全
- 务必在使用后调用 close(),否则可能丢失缓冲数据或占用文件句柄
- JDK 7+ 推荐配合 try-with-resources 使用:
try (RandomAccessFile raf = new RandomAccessFile("data.bin", "rw")) {
raf.seek(0);
raf.writeUTF("Hello");
}


















