Java 如何使用JakeWharton'正确读取和写入数据;那是迪克鲁卡什吗?
我试图在我的Android应用程序中使用Jake Wharton的DiskLruCache,但我似乎不知道如何使用缓存正确地序列化和反序列化对象。在基本命令行Java程序中使用以下代码:Java 如何使用JakeWharton'正确读取和写入数据;那是迪克鲁卡什吗?,java,android,Java,Android,我试图在我的Android应用程序中使用Jake Wharton的DiskLruCache,但我似乎不知道如何使用缓存正确地序列化和反序列化对象。在基本命令行Java程序中使用以下代码: DiskLruCache.Editor editor = null; try { editor = diskLruCache.edit("objects"); OutputStream timeOs = editor.newOutputStream(0); OutputStream d
DiskLruCache.Editor editor = null;
try {
editor = diskLruCache.edit("objects");
OutputStream timeOs = editor.newOutputStream(0);
OutputStream dataOs = editor.newOutputStream(1);
OutputStream timeBos = new BufferedOutputStream(timeOs);
OutputStream dataBos = new BufferedOutputStream(dataOs);
ObjectOutputStream timeOos = new ObjectOutputStream(timeBos);
ObjectOutputStream dataOos = new ObjectOutputStream(dataBos);
long createTime = System.currentTimeMillis();
String str = "testString";
ArrayList<String> list = new ArrayList<String>();
list.add("item1");
list.add("item2");
timeOos.writeLong(createTime);
// this works:
dataOos.writeObject(str);
// this does not work:
//dataOos.writeObject(list);
timeOos.close();
dataOos.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (editor != null)
try {
editor.commit();
} catch (IOException e) {
e.printStackTrace();
}
}
DiskLruCache.Editor=null;
试一试{
editor=diskLruCache.edit(“对象”);
OutputStream timeOs=editor.newOutputStream(0);
OutputStream dataOs=editor.newOutputStream(1);
OutputStream timeBos=新的缓冲输出流(timeOs);
OutputStream dataOs=新的BufferedOutputStream(dataOs);
ObjectOutputStream timeOos=新的ObjectOutputStream(timeBos);
ObjectOutputStream dataOos=新的ObjectOutputStream(DataOS);
long createTime=System.currentTimeMillis();
String str=“testString”;
ArrayList=新建ArrayList();
列表。添加(“第1项”);
列表。添加(“第2项”);
timeOos.writeLong(createTime);
//这项工作:
dataOos.writeObject(str);
//这不起作用:
//dataOos.writeObject(列表);
timeOos.close();
dataOos.close();
}捕获(IOE异常){
e、 printStackTrace();
}最后{
如果(编辑器!=null)
试一试{
commit();
}捕获(IOE异常){
e、 printStackTrace();
}
}
timeOos.writeLong(createTime)
和dataOos.writeObject(str)
成功将数据写入缓存,但将dataOos.writeObject(str)
替换为dataOos.writeObject(list)
不起作用。我尝试了ArrayList
s和HashMap
s,但它们似乎没有序列化并写入缓存。程序执行所有代码,然后在返回之前挂起大约一分钟,只在缓存目录中保留日志
文件
我不确定这是否是DiskLruCache无法处理容器对象的问题
编辑(2014-01-03):
. testStoreLong()
,testStoreString()
和testStoreArrayList()
通过,但testPersistArrayListSnapshot()
和testPersistArrayListEditor()
失败
这是一个奇怪的问题;如果我在第101行(editor.commit();
)上放置一个断点,然后跳过,则不会创建缓存文件test store array list.0
,并且snapshot==null
,测试失败。但是,如果我在第103行(DiskLruCache.Snapshot Snapshot=mDiskLruCache.get(“测试存储阵列列表”);
)放置一个断点,文件将按预期创建
也许DiskLruCache中有一个bug;是否有其他与Android兼容的磁盘缓存库?嗯,是的,Jake Wharton为创建此缓存库提供了一些支持,但我发现它使用起来非常不直观,我找到的所有示例都是用于图像缓存的 我重新创建了两种方法,应该对您有所帮助
public void put(String key, Object object)
{
DiskLruCache.Editor editor = null;
try
{
editor = mDiskCache.edit(key);
if (editor == null)
{
return;
}
ObjectOutputStream out = new ObjectOutputStream(editor.newOutputStream(0));
out.writeObject(object);
out.close();
editor.commit()
}
catch()...etc
还有把你的东西拿出来
public Object get(String key)
{
DiskLruCache.Snapshot snapshot;
try
{
snapshot = mDiskCache.get(key);
ObjectInputStream in = new ObjectInputStream(snapshot.getInputStream(0));
return (Object) in.readObject();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException ex)
{
ex.printStackTrace();
}
}
这些是非常基本的get和put方法,您的示例代码在将对象放入缓存时似乎有点复杂,我认为这可能是问题所在。调用get()方法后,只需将对象强制转换为所需的任何类型,或者更好地更改这些方法以使用泛型以确保类型安全。问题在于缓存大小太小 我通过改变这一点解决了这个问题:
diskLruCache = DiskLruCache.open(new File("DiskLruCache"), 1, 2, 20 * 2^20);
为此:
diskLruCache = DiskLruCache.open(new File("DiskLruCache"), 1, 2, (long) (20 * Math.pow(2, 20)));
^
是位异或运算符,而不是指数运算符,因此缓存大小实际上是20*2^20==60
而不是它应该是的:20*Math.pow(2,20)==20971520
谢谢,但不幸的是我仍然有ArrayList
的问题。查看我最近的编辑。您尝试过我的函数吗?是()。类似的问题也会出现,其中snapshot==null
(在MyCache.java的第37行)好的,我在我的应用程序中存储ArrayList没有问题,我会在明天某个时候运行你的代码,然后给你回复。只需快速查看代码,myCacheTest的第35行“MyCache=new MyCache(mDirectory);”。我不确定,但这可能会重新创建和覆盖现有缓存,我认为有一个类似mDiskLruCache=DiskLruCache.open(cacheDir,DISK\u cache\u SIZE)的开放方法;thanx,我不知道它以整数参数值作为字节。