: O. Yuanying

キャッシュの実装

JAVA PRESSのvol 41に「キャッシュの実装」というコラムがあったのですが、これと全く同じパターンでファイルのキャッシュを実装してました。

まあ、それだけだとなんなのでReferenceMapを使って書き直してみたのがこのコード。

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.collections.ReferenceMap;

/**
 * @author yuanying
 */
public class Config {
  private static final Map CACHE =
    Collections.synchronizedMap(
      new ReferenceMap(ReferenceMap.HARD,
                    ReferenceMap.SOFT));
  private Properties config = null;
  private Config(Properties prop) {
    this.config = prop;
  }
  private String get(String key) {
    return this.config.getProperty(key);
  }
  public static Config getInstance(File file) {
    Config config = (Config) CACHE.get(file);
    if (config != null) {
      return config;
    }
    Properties prop = new Properties();
    InputStream is = null;
    try {
      is = new FileInputStream(file);
      is = new BufferedInputStream(is);
      prop.load(is);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (is!=null) {
          try {
            is.close();
          } catch (IOException e1) {
            e1.printStackTrace();
          }
      }
    }
    config = new Config(prop);
    CACHE.put(file, config);
    return config;
  }
}

CACHEをHashMapからReferenceMapに変更しただけですが、 これで幾分のメモリ節約になるはずです。

またよく使われるファイルのみをキャッシュしたいとか言う場合はLRUMapが良いのかもしれない。