2011-11-07 57 views
2

我需要在一個臨時文件中寫入一些數據,這個文件存儲在一個目錄答:我用File.createTempFile方法來做到這一點。但是,有一個線程會定期輪詢目錄A以檢查是否有臨時文件需要處理。設置文件不可讀

// create a temporary file that will contain the data 
newTmpFile = File.createTempFile("prefix", recoverFileExt, new File(
       recoverDirectory)); 
// the file is set to non readable, so the recovery thread cannot 
// access it 
newTmpFile.setReadable(false); 

//write data into the file 

// the file is written, it is set to readable so the recovery thread 
// can now access it 
newTmpFile.setReadable(true); 

的問題是,我不想做寫入操作之前,恢復線程訪問該文件。所以,我使用這種機制:我創建該文件,將其設置爲不可讀,寫入,然後將其設置爲可讀並關閉它。問題是,在文件創建後,文件仍然可讀,線程可以訪問它。

所以,我想知道是否有設置該文件作爲非可讀在其創建的可能性,或者如果你有其他的解決方案。

感謝

回答

5

我的建議是,首先給文件一個不同的名稱(例如,使用不同的前綴),它已經寫入後重新命名。

這樣的恢復線程可以partially-和完全寫入的文件區分,只有處理後者。

+0

另請注意,如果目錄位於同一文件系統上,則可以在目錄之間快速重命名文件。 (這不是NFS推薦的,但NFS並不真正用於「數據完整性」。) –

+0

我接受其設施的答案。但是,我知道使用文件名進行同步不是一個好習慣。 –

0

恕我直言,這不是做它的方式。使用信號/互斥來控制線程同步。嘗試使用文件同步線程是一個壞習慣,並且會在稍後導致更多的錯誤。

0

創建的文件

你不應該使用的文件系統,因爲以這種方式鎖定機制的指數。具有不同文件名的Aix解決方案可以工作,但並不理想。

一個更好的解決辦法是在內存中加載的地方,兩個線程可以訪問文件的索引。任何時候當你創建一個文件進行處理時,一旦完成並準備好處理,將它添加到索引中。然後恢復線程只會訪問它在索引中給出的文件來處理。

該指數將有效地爲恢復線程工作隊列。

0

我會通過創建具有該線程將忽略的特殊名稱的文件來繞過它。然後,您首先將其重命名,然後將其更改爲可讀。所以,你將有兩個檢查 - 該文件是不可讀的,以及它是否有一個特殊的名字..

0

如果線程在同一過程中,你可以保持它控制了多少數據已經安全寫入的計數器。這使您可以在寫入恢復日誌時儘快處理日誌。