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项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 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");
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










