java - 在没有 O_SYNC 语义的情况下用 Java 编写文件

标签 java io nio nio2

在 C 中,当我调用 open() 打开文件描述符时,我必须显式传递 O_SYNC 标志以确保对此文件的写入将被持久化在 write() 返回时写入磁盘。如果我愿意,我可以open()提供O_SYNC,然后我的写入将返回得更快,因为它们只需要返回之前将其放入文件系统缓存中。如果我愿意,稍后我可以通过调用 fsync() 强制将此文件的所有未完成写入写入磁盘,该操作会阻塞直到该操作完成。 (有关所有这些的更多详细信息,请参阅 Linux man page。)

有什么方法可以在Java中做到这一点吗?我能找到的最相似的事情是使用 BufferedOutputStream 并在其上调用 .flush() ,但如果我正在写入随机文件偏移量,我相信这意味着输出流的内部缓冲区最终可能会消耗大量内存。

最佳答案

使用 Java 7 NIO FileChannelforce方法:

RandomAccessFile aFile = new RandomAccessFile("file.txt", "rw");
FileChannel inChannel = aFile.getChannel();
// .....................
// flushes all unwritten data from the channel to the disk
channel.force(true);

一个重要的细节:

If the file does not reside on a local device then no such guarantee is made.

关于java - 在没有 O_SYNC 语义的情况下用 Java 编写文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35955003/

相关文章:

Java tryLock释放多个JVM上的锁

java - 为什么 WatchService 会产生这么多操作?

java - 如何使用 MongoTemplate 将单个字段插入到 JSON 中?

检查非阻塞发送是否成功

Java随机百分比

java - Java快速读取特定数据的方法

java - 如何检查特定文件夹或文件是否与 java 程序共享?

java - 如何通过java nio writer覆盖文件?

java - "proper"带有tomcat认证的登录页面

java - 如何使用%符号格式化JTable单元格?