2013-05-28 34 views
1

我有兩個java進程(JAR),每隔1分鐘向一個文本文件寫入數據,另一個讀取該文件並調用Web服務以將數據存儲在數據庫中。用於基於文件的進程通信的Java文件鎖定機制

有什麼辦法來鎖定文件,當它處於寫模式?我觀察到,當wvdial撥號調制解調器時,它在/var/lock/ttyUSB0..LOCK中創建一個鎖文件,我想。如果文件處於寫入模式,另一個進程可能要等到寫入完成,我才需要這種過程。寫入過程後可以讀取文件內容。

請指導我解決我的問題。

謝謝

回答

2

也許這個類可以幫助你http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html

編輯:在閱讀過程中

FileInputStream in = new FileInputStream(file); 
try 
{ 
    java.nio.channels.FileLock lock = in.getChannel().lock(); 
    try 
    { 
     //write 
    } 
    finally 
    { 
     lock.release(); 
    } 
} 
finally 
{ 
    in.close(); 
} 

現在:此信息可能已經被覆蓋了主體How can I lock a file using java (if possible)

爲例:

FileInputStream in = new FileInputStream(file); 
try 
{ 
    FileLock lock = in.getChannel().tryLock(); 
    if (lock == null) 
    { 
     //file is locked, wait or do something else 
    } 
    else 
    { 
     try 
     { 
      //read 
     } 
     finally 
     { 
      lock.release(); 
     } 
    } 
} 
finally 
{ 
    in.close(); 
} 
+1

不幸的是,鎖定是大部分時間的建議,而不是強制 - 這就是爲什麼我建議我的解決方案。 – fge

+0

我記得Javadoc寫道:「你不應該使用File類來鎖定文件,而是使用FileLock」併發佈一個鏈接,我承認我沒有閱讀整個文檔,所以我不知道這些東西。 – Djon

+0

如果我在寫入進程時使用'lock = channel.tryLock();',如果讀取進程需要讀取它會將此文件鎖定或解鎖? –

2

您將在這裏遇到的問題是Java不能open()O_EXCL,因此您無法以原子方式創建文件。

改爲使用目錄:創建目錄是一個原子操作。如果無法創建目錄,則File.mkdir()將返回false。 rmdir()當你完成了。

當然,請確保您的兩個進程都有對基本目錄的寫入權限!

+0

CVS(pserver?)使用此方法確保提交和讀取是MP安全的。缺點是,如果在解鎖之前鎖櫃終止,那麼鎖可以留下 - 所以把鎖放在一個tempfs上,至少可以在重啓後解鎖所有的東西! –