randomaccessfile 是 java 中唯一支持真正随机读写的文件操作类,通过 seek() 定位任意字节位置,支持“r”“rw”“rws”“rwd”模式,可读写基本类型、动态调整长度,并需正确关闭以避免资源泄漏。

RandomAccessFile 是 Java 中唯一能真正实现“随机读写”的文件操作类——它允许你跳转到文件任意位置(通过 seek(long pos)),既可读也可写,不依赖流的方向性,也不需要先读完前面的内容。
打开文件并指定读写模式
创建 RandomAccessFile 对象时必须传入文件路径和访问模式:
-
"r":只读,文件不存在会抛FileNotFoundException -
"rw":读写,文件不存在则自动创建(但目录需存在) -
"rws":读写 + 每次写操作都同步到磁盘(含元数据) -
"rwd":读写 + 每次写操作都同步到磁盘(仅数据,不含时间戳等元数据)
例如:RandomAccessFile raf = new RandomAccessFile("data.bin", "rw");
定位与读写基本操作
用 seek(long pos) 移动文件指针到指定字节偏移量(从 0 开始)。之后的读写都从该位置开始:
-
raf.write(int b)写入单字节;raf.write(byte[] b)写入字节数组 -
raf.read()读一个字节(-1 表示 EOF);raf.read(byte[] b)尝试读满数组 - 支持直接读写基本类型:
writeInt(int)、readDouble()等,按大端序、固定长度编码
注意:读写类型方法要求文件指针位置对齐。比如 writeInt() 占 4 字节,若当前指针在 3,则后续 readInt() 会读错——需确保前后调用逻辑匹配。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
获取文件长度与动态扩展
raf.length() 返回当前文件字节长度;raf.setLength(long newLength) 可截断或扩展文件(扩展部分为未定义内容,后续写入前需 seek() 到对应位置)。
常见技巧:想在末尾追加,可先 raf.seek(raf.length()),再写入;想修改中间某段,直接 seek() 过去覆盖即可(不会自动挪动后续内容)。
关闭与异常处理
RandomAccessFile 不是 NIO 的 Channel,不实现 AutoCloseable(Java 7+ 中已修复,实际现代 JDK 版本中它**实现了** AutoCloseable,可用 try-with-resources)。但为兼容老代码或明确语义,建议显式关闭:
务必在 finally 或 try-with-resources 中调用 raf.close(),否则可能丢失缓冲数据或导致文件句柄泄漏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










