rw模式不自动同步,数据可能丢失;rws模式每次写操作均同步内容和元数据到磁盘,确保强一致性。
Java 中 RandomAccessFile 的 rw 和 rws 模式在数据落盘行为上有本质区别,配置时不能只看“能不能读写”,关键在于是否强制同步到物理磁盘。直接用 rw 并不保证写入立即落盘,而 rws 是明确要求同步的可靠方式。
rw 仅表示可读可写,底层依赖操作系统缓存,写入的数据可能滞留在内存或文件系统缓冲区中,断电或进程崩溃会导致丢失。
fsync() 或类似系统调用 writeXXX() 方法,也不代表已写入磁盘 getFD().sync() RandomAccessFile raf = new RandomAccessFile("data.bin", "rw");raf.writeInt(12345);raf.getFD().sync(); // ← 关键:强制刷盘
rws 在构造时就启用同步语义:每次写操作(包括 writeInt()、writeBytes() 等)完成后,JVM 会主动调用 fsync(),确保:
RandomAccessFile raf = new RandomAccessFile("log.dat", "rws"); // ← 自带同步保障raf.writeLong(System.currentTimeMillis());raf.writeUTF("event occurred"); // 这两行写完即落盘
虽然问题未问 rwd,但常被混淆,这里简要对比:
立即学习“Java免费学习笔记(深入)”;
rwd:只同步文件内容,不保证元数据(如文件大小、mtime)落盘 rws:同步内容 + 元数据,更严格,适合要求强一致性的场景(如事务日志) rw,尤其在频繁小写场景下延迟明显 rws rw + 手动 sync() 更灵活 rwd 可作折中 不复杂但容易忽略