gpt4 book ai didi

java - 使用 Java 将字符串原子追加到 Windows 中的文件

转载 作者:行者123 更新时间:2023-12-01 13:17:49 27 4
gpt4 key购买 nike

根据this question ,Windows 上的小文件追加是原子的。

我试图在 Scala/Java 中利用这一点来避免在将小 int 附加到文件时锁定。

我发现使用 FileOutputStream(..., true) 从多个线程进行写入是交错的,即使上面链接的问题表明它们应该是原子的。

可以在 Scala 中找到此测试工具 on my github

关键代码是:

def invoked(id: Int, path: String) = {
val writer = new FileOutputStream(path, true)
val bytes = (id.toString + ';').getBytes(Charset.defaultCharset())
writer.write(bytes)
writer.close()
}

...我希望“调用”是线程安全的,无需锁定。

相同的 Java/Scala 代码在 Linux 上实现原子文件追加(根据 this question 小文件追加在 POSIX 上是原子的),因此差异似乎在于 FileOutputStream 的 native 实现。

也许FileOutputStream没有将正确的标志传递给Windows?有谁知道如何进行这项工作?我是否必须编写 JNI DLL 才能使其正常工作,或者有没有办法可以使用 Java 的标准库来实现此目的?

最佳答案

写操作行为取决于文件打开标志。在 Windows 上,您需要使用 FILE_APPEND_DATA 标志或使用特殊常量来实现追加。 Posix 需要 O_APPEND 标志。尽管 Java 有 bool 值用于附加参数,但查看其源代码以下注释解释了 why it does not work

FileDispatcherImpl(boolean append) {
/* append is ignored */
}

关于java - 使用 Java 将字符串原子追加到 Windows 中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22326703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com