2014-10-01 59 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())。