使用java在windows中向文件添加原子字符串

mec1mxoz  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(275)

根据这个问题,windows上的小文件附件是原子的。
我试图在scala/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?有人知道怎么做吗?我是否需要编写一个jnidll来让它工作,或者有没有一种方法可以用java的标准库来实现这一点?

dffbzjpn

dffbzjpn1#

写操作行为取决于文件打开标志。在windows上需要使用file\u append\u data标志或使用特殊常量来实现append。posix需要o\ U追加标志。尽管java在append参数中有bool值,但下面的注解解释了它为什么不工作。

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

相关问题