2011-12-09 100 views
0

在單元測試中,我覆蓋配置文件以測試處理不良屬性值。 我使用Apache的百科全書IO:Java複製覆蓋文件,讀取時獲取舊文件

org.apache.commons.io.FileUtils.copyFile(new File(configDir, "xyz.properties.badValue"), new File(configDir, "xyz.properties"), false) 

在調查文件系統,我可以看到xyz.properties其實覆蓋 - 尺寸被更新,內容是一樣的,即xyz.properties.badValue

當我完成通過代碼讀取文件到一個Properties對象(使用FileReader對象)的測試用例時,我得到原始xyz.properties文件的屬性,而不是新複製的版本。

通過調試,我單步調查文件,我可以排除它是寫入文件系統的時間問題。

複製步驟以某種方式保存文件句柄嗎?如果是這樣,我將如何再次釋放它? 如果沒有,是否有人知道爲什麼發生這種情況以及如何解決它?

謝謝。

+0

複製方法適當關閉所有句柄;沒有進一步的信息可能很難協助。你有一個可以重現錯誤的最小測試用例嗎? –

回答

1

我意識到這並不直接回答你的問題,但我認爲最好是維護兩個單獨的文件,並安排你的代碼在運行時配置/注入配置文件的名稱。這樣,您的測試可以指定使用哪個配置文件,而不是覆蓋單個文件。

2

如果您在此對象之前初始化了FileReader對象,則它將已經存儲舊版本的臨時副本。

你需要重新設置:

FileReader f = new FileReader("the.file"); 

// Copy and overwrite "the.file" 

f = new FileReader("the.file"); 

在Unix文件系統模型,包含文件的內容,只要有人有一個開放的filehandle到文件,或有一個目錄將持續的inode指向它的條目。

在目錄中替換該文件的,不會刪除inode(該文件的內容),所以你已經開filehandle可以繼續使用。

這實際上可以用來創建永不需要清理的臨時文件:創建文件,然後立即取消鏈接,同時保持打開狀態。當您關閉文件句柄時,inode收割

+0

...因爲在Unix文件系統模型中,只要有人在文件中有一個打開的文件句柄,包含文件內容的'inode'就會一直存在,*或*有一個指向它的目錄條目。在目錄中替換文件的*名稱*不會刪除'inode'(文件的內容),因此您已經打開的文件句柄可以繼續使用。這實際上可以用來創建永不需要清理的臨時文件:創建文件,然後立即「取消鏈接」,同時保持打開狀態。當你關閉文件句柄時,會獲得'inode'。 – BRFennPocock