RandomAccessFile 是 Java 中唯一支持真正随机读写文件的类,它通过 seek() 定位字节偏移实现双向读写,支持 "r"、"rw"、"rws"、"rwd" 四种模式,需显式 close(),不继承 InputStream/OutputStream。

RandomAccessFile 是 Java 中唯一支持真正随机读写文件的类,它像一个“文件指针”一样可以在文件任意位置跳转并读写数据,既不是纯输入流也不是纯输出流,而是独立的双向通道。
创建 RandomAccessFile 并指定读写模式
构造时必须传入文件路径和访问模式:
-
"r":只读模式,文件必须存在,否则抛出
FileNotFoundException - "rw":读写模式,文件不存在会自动创建;存在则保留原内容,可修改任意位置
- "rws":在 "rw" 基础上,每次写操作都同步到磁盘(含元数据),适合关键日志
- "rwd":仅同步写入的数据(不保证文件长度等元数据),性能略高
示例:
RandomAccessFile raf = new RandomAccessFile("data.bin", "rw");
用 seek() 定位到指定字节偏移量
seek(long pos) 将文件指针移动到从文件开头算起的 pos 字节处(从 0 开始)。这是实现“随机访问”的核心操作。
立即学习“Java免费学习笔记(深入)”;
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
- 如果
pos超过当前文件长度,后续写入会扩展文件(中间补 0) - 读取时若指针越界,会触发
EOFException或返回 -1(如 readByte) - 调用
getFilePointer()可随时查看当前指针位置
例如跳到第 100 字节开始读一个 int:
raf.seek(100);<br>int value = raf.readInt(); // 读取 4 字节,指针自动后移
按基本类型读写,注意字节序和长度
RandomAccessFile 提供了 readInt()、writeDouble() 等方法,所有数值类型均采用大端序(Big-Endian),且严格按 Java 规范占位(如 int 固定 4 字节)。
- 写字符串建议用
writeUTF(String)(带长度前缀,兼容 Java)或writeBytes(String)(单字节 ASCII,不推荐中文) - 避免混用
readLine()(已废弃,仅支持 ISO-8859-1)和现代字符编码操作 - 每次读写都会使指针自动前进对应字节数,无需手动管理偏移
关闭资源与异常处理要点
必须显式调用 close(),否则可能丢失缓冲数据或导致文件句柄泄漏。推荐使用 try-with-resources:
try (RandomAccessFile raf = new RandomAccessFile("log.dat", "rw")) {<br> raf.seek(512);<br> raf.writeLong(System.currentTimeMillis());<br>} catch (IOException e) {<br> e.printStackTrace();<br>}
注意:RandomAccessFile 不继承自 InputStream/OutputStream,不能直接套用装饰器(如 BufferedInputStream),如需缓冲需自行封装或改用 NIO 的 FileChannel。

















