根据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
的本机实现中。 / p>
也许FileOutputStream
没有将正确的标志传递给Windows?有谁知道如何使这项工作?我是否必须编写JNI DLL才能使其正常工作,或者我是否可以使用Java的标准库来实现此目的?
答案 0 :(得分:1)
写操作行为取决于文件打开标志。在Windows上,您需要使用FILE_APPEND_DATA标志或使用特殊常量来实现追加。 Posix需要O_APPEND标志。虽然注释解释why it does not work之后,Java的append参数的bool值正在查看其源代码。
FileDispatcherImpl(boolean append) {
/* append is ignored */
}