簡體   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