RandomAccessFile 是 Java 中唯一支持随机读写的类,直接继承 Object,通过 seek() 移动文件指针实现任意位置读写,追加只需 seek(length()),支持 r/rw/rws/rwd 四种模式并严格遵循字节序与数据类型匹配。

RandomAccessFile 是 Java IO 中唯一支持文件随机读写(即跳转到任意位置读/写)的类,它既不是 InputStream 也不是 OutputStream 的子类,而是直接继承自 Object,内部封装了文件指针(file pointer),可自由移动、读取或写入数据。它天然支持追加——只需将文件指针移到末尾即可,无需额外配置。
理解 RandomAccessFile 的构造与模式
创建 RandomAccessFile 对象时需指定文件路径和访问模式:
- "r":只读模式,尝试写入会抛出 IOException;
- "rw":读写模式,文件不存在时自动创建;
- "rws":读写 + 同步更新内容和元数据(如修改时间),适合高可靠性场景;
- "rwd":读写 + 同步更新内容(不保证元数据),性能略优于 rws。
例如:RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");
移动文件指针实现随机读写
通过 seek(long pos) 方法可将文件指针定位到指定字节偏移量(从 0 开始),之后的读写操作均从此位置开始:
立即学习“Java免费学习笔记(深入)”;
- 写入前调用
raf.seek(100),再执行raf.writeUTF("hello"),就会覆盖第 100 字节起的内容; - 读取前调用
raf.seek(50),再执行raf.readInt(),就从第 50 字节处按 int(4 字节)解析数据; - 用 getFilePointer() 可获取当前指针位置,用于调试或记录读写进度。
实现追加写入(无需特殊标记)
RandomAccessFile 本身不提供“append=true”参数,但追加逻辑很简单:
- 调用 length() 获取文件当前字节数;
- 用 seek(length()) 将指针移到末尾;
- 再执行 writeXXX 操作,即完成追加。
示例代码片段:
raf.seek(raf.length()); // 定位到末尾
raf.writeUTF("新日志:" + System.currentTimeMillis());
注意数据类型与字节对齐
RandomAccessFile 提供了 read/write 系列方法(如 readInt、writeDouble),它们严格按固定长度和大端字节序处理基本类型。这意味着:
- writeInt(123) 写入 4 个字节,readInt() 必须在相同位置读取,否则会错位或抛出 EOFException;
- 字符串用 writeUTF() 写入,必须用 readUTF() 读取——它自带长度前缀(2 字节),不能混用 writeBytes/readLine;
- 若混合使用文本与二进制数据,建议自行规划格式(如用分隔符或结构化头),避免解析混乱。


















