繁体   English   中英

如何从 Java 应用程序中为操作系统上的所有其他进程锁定文件?

[英]How can I lock a file from within a Java application for all other processes on a operating system?

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

我想防止3发生:

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

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

Java API 是java.nio.channels.FileLock 你说:

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

这种理解是不正确的。 FileLock的文档中:

平台依赖

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

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

[...]

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

文件系统是操作系统/实现特定的 WRT“锁定”,我的猜测是要可靠地做到这一点,您必须通过文件权限来做到这一点。

您没有提供有关操作系统/文件系统类型的任何详细信息,因此没有具体答案。

如果有一种方法可以“锁定”文件系统上的某些文件,我敢打赌,它不会是可移植的。

我有一个防止其他进程可以访问此文件的想法是重命名它,直到您的应用程序完成。

1. Load the file and rename it. For example, example.txt to example.txt.tmp
2. Reading file example.txt.tmp from myApp.java
.....
6. Rename your file name back to the original one.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM