java - 如何从 Java 应用程序中为操作系统上的所有其他进程锁定文件?
问题描述
我有一个需要多次阅读的文件。我必须按顺序将 InputStream 打开到同一个文件。现在我想知道只要 Java 应用程序的特定部分正在运行,是否可以为整个操作系统锁定该文件?
我想防止3发生:
example.txt
从 myApp.java读取文件- 停止阅读文件
example.txt
- 其他进程写入文件(即
echo "foo" >> example.txt
) example.txt
从 myApp.java读取文件
据我了解java.nio.FileChannel
,lock 只会锁定其他 JVM 应用程序对文件的访问。
解决方案
用于此的 Java API 是java.nio.channels.FileLock
. 你说:
据我了解
java.nio.FileChannel
,lock 只会锁定其他 JVM 应用程序对文件的访问。
这种理解是不正确的。从以下文档FileLock
:
平台依赖
此文件锁定 API 旨在直接映射到底层操作系统的本机锁定设施。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的 [强调添加]。
锁是否实际上阻止另一个程序访问锁定区域的内容是系统相关的,因此未指定。某些系统的本机文件锁定工具只是建议性的,这意味着程序必须协同遵守已知的锁定协议以保证数据完整性。在其他系统上,本机文件锁是强制性的,这意味着如果一个程序锁定了文件的某个区域,那么实际上会阻止其他程序以违反锁定的方式访问该区域。在其他系统上,本机文件锁是建议性的还是强制性的,可以根据每个文件进行配置。为确保跨平台的一致和正确行为,强烈建议将此 API 提供的锁用作建议锁。
[...]
但是,正如您所看到的,锁的确切性质是特定于平台的。
推荐阅读
- javascript - 如何使用jquery获取每个表的单元格
- antlr4 - ANTLR4:逗号未检测为 unicode char
- node.js - 在 Firebase 函数上运行 mocha 时出现问题
- c# - 从数组播放音频 - Unity
- python - 在嵌套列表之间的不同位置交换元素 - python
- java - 如何更改项目的编译 SDK 版本?
- c++ - c ++ WxWidgets的示例代码将图像blit到画布上
- oracle - PL/SQL:如何根据列值插入
- python - 从嵌套的 JSON 创建关系数据库
- java - 关于 OptaPlanner 配置以解决车辆路由(实时)的提示