原子追加字符串使用Java在Windows文件(Atomic append string to fi

2019-10-29 20:52发布

根据这个问题 ,小的文件附加在Windows上是原子。

我想利用这个斯卡拉/ Java的,以避免附加一个小的int文件时锁定。

我发现写入使用FileOutputStream(..., true)从多个线程被交错,尽管上面链接的问题,建议他们应该是原子的。

测试工具为这个Scala中可以发现在我的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上(按照这一问题的小文件附加上POSIX原子),这样的差异似乎是在本地实现FileOutputStream

也许FileOutputStream没有传递正确的标志到Windows? 有谁知道如何使这项工作? 我会写一个JNI DLL得到这个工作,还是有办法可以用Java的标准库做到这一点?

Answer 1:

写操作行为依赖于文件打开标志。 在Windows中,您需要使用FILE_APPEND_DATA标志,或使用特殊常量来实现追加。 POSIX要求O_APPEND标志。 虽然Java有追加参数寻找到它的源代码bool值以下注释解释了为什么这是行不通的 。

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


文章来源: Atomic append string to file in Windows using Java