首页 > 解决方案 > 如何从 Java 应用程序中为操作系统上的所有其他进程锁定文件?

问题描述

我有一个需要多次阅读的文件。我必须按顺序将 InputStream 打开到同一个文件。现在我想知道只要 Java 应用程序的特定部分正在运行,是否可以为整个操作系统锁定该文件?

我想防止3发生:

  1. example.txt从 myApp.java读取文件
  2. 停止阅读文件example.txt
  3. 其他进程写入文件(即echo "foo" >> example.txt
  4. example.txt从 myApp.java读取文件

据我了解java.nio.FileChannel,lock 只会锁定其他 JVM 应用程序对文件的访问。

标签: javafilestreamfile-processing

解决方案


用于此的 Java API 是java.nio.channels.FileLock. 你说:

据我了解java.nio.FileChannel,lock 只会锁定其他 JVM 应用程序对文件的访问。

这种理解是不正确的。从以下文档FileLock

平台依赖

此文件锁定 API 旨在直接映射到底层操作系统的本机锁定设施。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的 [强调添加]

锁是否实际上阻止另一个程序访问锁定区域的内容是系统相关的,因此未指定。某些系统的本机文件锁定工具只是建议性的,这意味着程序必须协同遵守已知的锁定协议以保证数据完整性。在其他系统上,本机文件锁是强制性的,这意味着如果一个程序锁定了文件的某个区域,那么实际上会阻止其他程序以违反锁定的方式访问该区域。在其他系统上,本机文件锁是建议性的还是强制性的,可以根据每个文件进行配置。为确保跨平台的一致和正确行为,强烈建议将此 API 提供的锁用作建议锁。

[...]

但是,正如您所看到的,锁的确切性质是特定于平台的。


推荐阅读