2010-03-19 53 views
4

我正在創建一個用於打開和編輯xml文件的簡單應用程序。 這些文件位於由應用程序的多個實例訪問的本地文件夾中。 我想要做的是鎖定應用程序實例打開的每個文件,以便其他實例無法訪問它。Java文件鎖定機制(FileLock等)的問題

要做到這一點我使用下面的代碼:

函數void READFILE(){

File xmlFile = new File("myFile.xml"); 
    RandomAccessFile raf = new RandomAccessFile(xmlFile, "rw"); 
    FileLock fl = raf.getChannel().tryLock(); 

    if(fl==null){ 
     System.out.println("file already locked by another instance"); 
    }else{ 
     setCurrentFile(raf); 
     setLock(fl); 
     System.out.println("file successfully locked by this instance"); 
    } 

}

因爲我想保留文件上的鎖被編輯的時間我不會關閉raf也不會釋放fl。

此時嘗試訪問鎖定文件的任何其他應用程序實例都無法執行此操作。到現在爲止還挺好。

我觀察到以下怪事:

如果獲取該文件上的鎖後,我打開同一個文件一個FileInputStream,即使的FileLock對象仍然有效(isValid方法返回true)的,其他實例該應用程序現在可以訪問正在編輯的文件。

我覺得這種行爲很奇怪。 任何人都可以解釋爲什麼會發生這種情況?

我希望以上是有道理的。 在此先感謝!

+0

WIndows? Linux呢?蘋果系統?文件鎖定實際上是一項OS功能。 – bmargulies 2010-03-19 17:20:13

+1

我已經在MacOS和WindowsXP上測試過了。我意識到不同的底層操作系統可能會導致鎖定過程的影響。但我認爲它與OS沒有任何關係。謝謝! – KostasT 2010-03-19 17:45:31

回答

7

從的FileLock的JavaDoc:

鎖定不管是否實際上阻止另一個程序訪問該鎖定區域的內容是與系統相關的和因此是未指定。

您的平臺只提供諮詢鎖定。持有諮詢鎖不會阻止其他進程訪問該文件。

因此,鎖定一個文件實際上只是掛出一個「請勿打擾」的標誌,但將門打開。如果每個人都讀取和榮譽的標誌,你很棒,但它不會從剛會走路的阻止任何人

的javadoc也明確規定:

文件持有鎖代表整個的Java虛擬機。它們不適用於控制同一虛擬機內多個線程對文件的訪問。

如果您的代碼在應用程序服務器上運行,則文件鎖定將不會執行您所需的操作。