1 package com.hughes.android.util;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.ObjectInputStream;
7 import java.io.ObjectOutputStream;
8 import java.util.LinkedHashMap;
11 import android.content.Context;
12 import android.util.Log;
14 public class PersistentObjectCache {
16 private final File dir;
17 private final Map<String, Object> objects = new LinkedHashMap<String, Object>();
19 public synchronized Object read(final String filename) {
20 Object object = (objects.get(filename));
24 Log.d(getClass().getSimpleName(), "Cache miss.");
25 final File src = new File(dir, filename);
27 Log.d(getClass().getSimpleName(), "File empty: " + src);
31 final ObjectInputStream in = new ObjectInputStream(new FileInputStream(src));
32 object = in.readObject();
34 } catch (Exception e) {
35 Log.e(getClass().getSimpleName(), "Deserialization failed: " + src, e);
38 objects.put(filename, object);
42 public synchronized void write(final String filename, final Object object) {
43 objects.put(filename, object);
44 final File dest = new File(dir, filename);
46 final ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(dest));
47 out.writeObject(object);
49 } catch (Exception e) {
50 Log.e(getClass().getSimpleName(), "Serialization failed: " + dest, e);
54 private PersistentObjectCache(final Context context) {
55 dir = context.getFilesDir();
58 public static synchronized PersistentObjectCache getInstance() {
59 if (instance == null) {
60 throw new RuntimeException("getInstance called before init.");
65 public static synchronized PersistentObjectCache init(final Context context) {
66 if (instance == null) {
67 instance = new PersistentObjectCache(context);
69 if (!instance.dir.equals(context.getFilesDir())) {
70 throw new RuntimeException("File dir changed. old=" + instance.dir + ", new=" + context.getFilesDir());
76 private static PersistentObjectCache instance = null;