RandomAccessFile 是 Java 中唯一支持真正随机读写的类,通过 seek() 定位、readXxx()/writeXxx() 操作基本类型,结合定长或变长规则安全处理字符串。

RandomAccessFile 是 Java 中唯一能真正实现文件“随机读写”的类——它像一个可前后移动的指针,直接定位到文件任意字节位置进行读或写,无需加载整个文件,也不依赖缓冲区顺序流转。关键在于它的 seek(long pos) 方法,配合 readXxx() 和 writeXxx() 系列方法,就能精准操作结构化数据(如整数、浮点数、字符串)或提取/替换某一段字节(即切片)。下面分三部分说明核心用法:
一、按偏移量读写基本类型变量
文件可视为连续字节数组,每个 Java 基本类型有固定长度(如 int 占 4 字节,double 占 8 字节),只要知道变量起始位置(偏移量),就能准确定位。
- 用
seek(pos)将文件指针移到目标字节位置(从 0 开始计数) - 调用
readInt()/readDouble()等方法自动按类型长度读取并解析;写入同理,用writeInt(123)等会严格写入对应字节数 - 注意:读写必须严格匹配类型和顺序,否则字节错位会导致值错误(例如用
readShort()读一个实际存的是int的位置,只取前 2 字节,结果必错)
二、实现字符串的定长/变长安全存取
字符串没有固定字节长度,需自行约定编码与长度规则,否则无法准确定位。
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
-
定长字符串:预先分配固定字节数(如 32 字节 UTF-8),写入前用
String.getBytes("UTF-8")截断或补 0,读取后用new String(bytes, "UTF-8")解码并去除末尾 \0 -
变长字符串(推荐):先写入长度(如用
writeInt(len)),再写入字节内容;读取时先readInt()得长度,再readFully(new byte[len])读完整内容 - 避免直接用
readLine()(已废弃)或readUTF()(仅支持修改版 UTF-8,且要求长度
三、对文件做字节级切片存取(读取/覆盖某一段)
所谓“切片”,本质是读取或写入指定长度的原始字节块,适用于图片片段、加密数据块、日志截取等场景。
- 读切片:
seek(startPos)→readFully(byte[] buf, 0, length),buf 长度必须 ≥ length,否则抛IOException - 写切片(覆盖):
seek(startPos)→write(byte[] data, 0, length),从 startPos 开始逐字节覆盖,不改变文件总长度 - 若要“插入”新内容(增长文件),需先读取后续全部数据到内存,再写入新数据 + 原后续数据;删除同理需复制跳过目标段——RandomAccessFile 不支持原地插入/删除
实际使用时务必用 try-with-resources 包裹,确保 close() 被调用;多线程访问同一文件需自行加锁;文件路径建议用 FileChannel 配合 ByteBuffer 做更高效批量操作,但 RandomAccessFile 仍是理解底层字节寻址逻辑最直观的入口。

















