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 <T> T read(final String filename, final Class<T> resultClass) {
21 Object object = (objects.get(filename));
23 return resultClass.cast(object);
25 Log.d(getClass().getSimpleName(), "Cache miss.");
26 final File src = new File(dir, filename);
28 Log.d(getClass().getSimpleName(), "File empty: " + src);
32 final ObjectInputStream in = new ObjectInputStream(new FileInputStream(src));
33 object = in.readObject();
35 } catch (Exception e) {
36 Log.e(getClass().getSimpleName(), "Deserialization failed: " + src, e);
39 objects.put(filename, object);
40 return resultClass.cast(object);
41 } catch (ClassCastException e) {
46 public synchronized void write(final String filename, final Object object) {
47 objects.put(filename, object);
48 final File dest = new File(dir, filename);
50 final ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(dest));
51 out.writeObject(object);
53 } catch (Exception e) {
54 Log.e(getClass().getSimpleName(), "Serialization failed: " + dest, e);
58 private PersistentObjectCache(final Context context) {
59 dir = context.getFilesDir();
62 public static synchronized PersistentObjectCache getInstance() {
63 if (instance == null) {
64 throw new RuntimeException("getInstance called before init.");
69 public static synchronized PersistentObjectCache init(final Context context) {
70 if (instance == null) {
71 instance = new PersistentObjectCache(context);
73 if (!instance.dir.equals(context.getFilesDir())) {
74 throw new RuntimeException("File dir changed. old=" + instance.dir + ", new=" + context.getFilesDir());
80 private static PersistentObjectCache instance = null;