2014-10-01 42 views
0

例如,我在代碼中有一些地方,它從磁盤接收許多文件(其中許多是相同的),並進一步將它們解組。如何在這種情況下創建緩存映射?

final File configurationFile = getConfigurationFile(); 
FileOutputStream fileOutputStream = new FileOutputStream(configurationFile); 
Marshaller.marshal(configObject, fileOutputStream); 

很顯然,我可以創建一個特殊的緩存地圖爲他們提高性能(爲了不給解組完全相同的文件,一遍又一遍)。對我而言,HashMap的實現就足夠了。

現在的問題是:我應該使用什麼關鍵?

configurationFile.hashCode()對此很不好?

感謝您的所有答案!

+2

您如何識別兩個文件是相同的?按文件名?如果答案是肯定的,文件名應該是關鍵。 – Eran 2014-10-01 08:57:32

+0

無論如何,使用hashCode會是錯誤的,因爲不同的文件可能具有相同的hashCode。 – Eran 2014-10-01 09:00:08

回答

0

使用規範路徑代替絕對路徑(explanation of the difference)並將其放入HashSet中。集不允許重複的值。如果你嘗試添加一個已經存在的值,它將返回false,否則返回true。

示例代碼(未經測試):

Set<String> filesMarshalled= new HashSet<>(); 
... 
final File configurationFile = getConfigurationFile(); 
if (filesMarshalled.add(configurationFile.getCanonicalPath())) { 
    //not marshalled yet 
    FileOutputStream fileOutputStream = new FileOutputStream(configurationFile); 
    Marshaller.marshal(configObject, fileOutputStream); 
} 
0

你也可以使用hashset而不用擔心密鑰。

if(hashset.add(file)) { 
    // do unmarshling; 
} else { 
    //do nothing 
} 

如果可以添加對象,則Hashset.add()方法返回true。 如果您嘗試添加重複條目,那麼它將返回false,因爲在集合中不允許重複。

0

...相同的一遍又一遍的文件...

什麼是相同的?

  • 如果文件內容決定,可以使用文件內容(例如MD5,SHA1,SHA256)的散列作爲關鍵字。

  • 如果文件名必須相同,只需使用文件名作爲密鑰即可。

  • 如果是文件路徑,則使用文件的完整路徑作爲密鑰(File.getCanonicalPath())。