RandomAccessFile 是 Java 中唯一支持文件指针定位、既能读又能写的 I/O 类,通过 seek() 精准跳转、read/write 操作实现随机读写与断点续传,需注意编码处理、线程安全、文件扩展与及时关闭。

RandomAccessFile 是 Java 中唯一支持文件指针定位、既能读又能写的 I/O 类,天然适合随机读写和断点续传场景。它不依赖流的方向性,通过 seek(long pos) 直接跳转到任意字节位置,配合 read()/write() 系列方法,可精准控制读写起点与长度。
随机读写:用 seek() 定位,按需读写
RandomAccessFile 的核心是维护一个隐式的文件指针(file pointer),每次读写后自动后移,但可通过 seek() 手动重置:
- 创建时指定模式:
new RandomAccessFile(file, "rw")(读写)或"r"(只读) - 调用
getFilePointer()获取当前偏移量,length()获取文件总大小 - 写入前先
seek(pos)跳转——比如更新第 1024 字节开始的 4 字节 int 值:
raf.seek(1024); raf.writeInt(newValue); - 读取某段数据也同理:
raf.seek(2048); byte[] buf = new byte[512]; raf.read(buf);
断点续传:记录已传输位置,恢复时 seek 继续
断点续传本质是「保存进度 + 恢复位置」。RandomAccessFile 天然支持从任意位置继续写入,关键在于外部持久化记录已写入的字节数:
- 上传/下载前,先读取本地断点文件(如
resume.pos)获取上次结束的 offset - 打开目标文件时用
"rw"模式,然后raf.seek(offset) - 后续写入直接追加在该位置,无需清空或覆盖前面内容
- 每完成一段(如 8KB),更新断点文件中的 offset 值,确保崩溃后可精确恢复
- 注意:若服务端也支持 range 请求(HTTP 的
Range: bytes=xxx-),客户端需同步请求对应区间,避免数据错位
实用细节与避坑提醒
RandomAccessFile 行为与普通流不同,使用中需注意:
立即学习“Java免费学习笔记(深入)”;
- 字符编码需自行处理——它操作的是原始字节,写字符串要用
getBytes(charset),读出来再用new String(bytes, charset) - 多线程访问同一文件必须加锁,它本身不保证线程安全;建议用
synchronized或ReentrantLock保护seek+read/write组合操作 - 写入时若超出当前文件长度,会自动扩展(中间补 0);但不会自动截断,删除冗余数据需手动调用
setLength(newLength) - 关闭前务必调用
close(),否则缓冲区可能未刷盘,且文件句柄泄漏


















