根据这个问题,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的标准库来实现这一点?
1条答案
按热度按时间dffbzjpn1#
写操作行为取决于文件打开标志。在windows上需要使用file\u append\u data标志或使用特殊常量来实现append。posix需要o\ U追加标志。尽管java在append参数中有bool值,但下面的注解解释了它为什么不工作。