RandomAccessFile 是 Java 中唯一支持随机访问的文件类,通过 seek(long pos) 移动文件指针实现任意位置读写,pos≥0,超出长度时写入自动扩展文件;读写操作基于字节偏移量,需注意编码与越界检查,多线程需同步,写入后建议 sync 保证持久化。RandomAccessFile 是 Java 中唯一支持随机访问的文件类,它通过内部维护一个“文件指针”(file pointer)来定位读写位置。调用 seek(long pos) 方法可直接将指针移动到指定字节偏移量处(从文件开头算起,0 起始),之后的 read 或 write 操作就从此位置开始执行。
seek 的核心规则
读取任意位置的数据
先 seek 到目标位置,再用 readXXX 方法读取。例如读取第 100 字节开始的 int 值:
raf.seek(100); // 定位到第 100 字节(索引 100)int value = raf.readInt(); // 读取 4 字节,对应位置 100~103
注意:readInt() 会按大端序读取连续 4 字节,若该位置不足 4 字节(如接近末尾),会抛出 EOFException。
立即学习“Java免费学习笔记(深入)”;
在任意位置写入并保留原内容
seek 后 write 不会自动插入数据,而是覆盖。例如在第 50 字节处写入字符串 "AB"(UTF-8 编码为 2 字节):
raf.seek(50);raf.write("AB".getBytes(StandardCharsets.UTF_8)); // 覆盖原位置的 2 字节
若想“插入”而非覆盖,需手动读取后续内容 → seek 到新位置 → 写入新增数据 → 再写回原内容(需额外缓冲区,且效率较低)。
常见陷阱与建议
raf.length() 获取当前文件长度,避免读取时触发 EOFExceptionraf.getFD().sync()