我有兩個java進程(JAR),每隔1分鐘向一個文本文件寫入數據,另一個讀取該文件並調用Web服務以將數據存儲在數據庫中。用於基於文件的進程通信的Java文件鎖定機制
有什麼辦法來鎖定文件,當它處於寫模式?我觀察到,當wvdial
撥號調制解調器時,它在/var/lock/ttyUSB0..LOCK中創建一個鎖文件,我想。如果文件處於寫入模式,另一個進程可能要等到寫入完成,我才需要這種過程。寫入過程後可以讀取文件內容。
請指導我解決我的問題。
謝謝
我有兩個java進程(JAR),每隔1分鐘向一個文本文件寫入數據,另一個讀取該文件並調用Web服務以將數據存儲在數據庫中。用於基於文件的進程通信的Java文件鎖定機制
有什麼辦法來鎖定文件,當它處於寫模式?我觀察到,當wvdial
撥號調制解調器時,它在/var/lock/ttyUSB0..LOCK中創建一個鎖文件,我想。如果文件處於寫入模式,另一個進程可能要等到寫入完成,我才需要這種過程。寫入過程後可以讀取文件內容。
請指導我解決我的問題。
謝謝
也許這個類可以幫助你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();
}
您將在這裏遇到的問題是Java不能open()
和O_EXCL
,因此您無法以原子方式創建文件。
改爲使用目錄:創建目錄是一個原子操作。如果無法創建目錄,則File
的.mkdir()
將返回false。 rmdir()
當你完成了。
當然,請確保您的兩個進程都有對基本目錄的寫入權限!
CVS(pserver?)使用此方法確保提交和讀取是MP安全的。缺點是,如果在解鎖之前鎖櫃終止,那麼鎖可以留下 - 所以把鎖放在一個tempfs上,至少可以在重啓後解鎖所有的東西! –
不幸的是,鎖定是大部分時間的建議,而不是強制 - 這就是爲什麼我建議我的解決方案。 – fge
我記得Javadoc寫道:「你不應該使用File類來鎖定文件,而是使用FileLock」併發佈一個鏈接,我承認我沒有閱讀整個文檔,所以我不知道這些東西。 – Djon
如果我在寫入進程時使用'lock = channel.tryLock();',如果讀取進程需要讀取它會將此文件鎖定或解鎖? –