如何在这种情况下创建缓存映射?

时间:2014-10-01 08:56:03

标签: java caching

例如,我的代码中有一些位置,它从磁盘接收许多文件(其中许多是相同的),并进一步解组它们。

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

显然,我可以为它们创建一个特殊的缓存映射来提高性能(为了不再反复解组相同的文件)。就我而言,HashMap实施就足够了。

问题是:我应该使用哪个键?

configurationFile.hashCode()对此非常不好?

感谢您的所有答案!

3 个答案:

答案 0 :(得分:0)

您也可以使用hashset而不必担心密钥。

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

如果可以添加对象,则Hashset.add()方法返回true。 如果您尝试添加重复条目,则它将返回false,因为不允许在集合中使用重复项。

答案 1 :(得分:0)

  

......一次又一次地使用相同的文件......

什么是相同的?

  • 如果文件内容决定,您可以使用文件内容的哈希值(例如MD5,SHA1,SHA256)作为密钥。

  • 如果文件名必须相同,只需使用文件名作为密钥。

  • 如果是文件路径,则使用文件的完整路径作为密钥(File.getCanonicalPath())。

答案 2 :(得分: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);
}