Atomic使用Java将字符串附加到Windows中的文件

时间:2014-03-11 13:09:26

标签: java windows multithreading scala

根据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的标准库来实现此目的?

1 个答案:

答案 0 :(得分:1)

写操作行为取决于文件打开标志。在Windows上,您需要使用FILE_APPEND_DATA标志或使用特殊常量来实现追加。 Posix需要O_APPEND标志。虽然注释解释why it does not work之后,Java的append参数的bool值正在查看其源代码。

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