gpt4 book ai didi

java - 如何使用 JakeWharton 的 DiskLruCache 正确读写数据?

转载 作者:搜寻专家 更新时间:2023-11-01 02:26:45 27 4
gpt4 key购买 nike

我正在尝试在我的 Android 应用程序中使用 Jake Wharton 的 DiskLruCache,但我似乎无法弄清楚如何使用缓存正确序列化和反序列化对象。在基本命令行 Java 程序中使用以下代码:

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();
}
}

timeOos.writeLong(createTime)dataOos.writeObject(str) 成功将数据写入缓存,但是替换dataOos.writeObject(str)dataOos.writeObject(list) 不起作用。我试过 ArrayListHashMap,看起来它们没有序列化并写入缓存。该程序执行所有代码,然后在返回前挂起大约一分钟,只在缓存目录中留下 journal 文件。

我不确定这是否是 DiskLruCache 无法处理容器对象的问题。

The full source and original post can be found here

编辑(2014-01-03): Here's a JUnit test using the Android SDK . testStoreLong()testStoreString()testStoreArrayList() 通过,但 testPersistArrayListSnapshot()testPersistArrayListEditor () 失败。

这是一个奇怪的问题;如果我在第 101 行设置断点 (editor.commit();) 然后跳过,缓存文件 test-store-array-list.0 创建并且 snapshot == null,未通过测试。但是如果我在第 103 行放置一个断点 (DiskLruCache.Snapshot snapshot = mDiskLruCache.get("test-store-array-list");) 文件创建为预期。

也许 DiskLruCache 有一个错误;是否有任何与 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() 方法后,只需将对象转换为您想要的任何类型,或者更好的是仍然更改这些方法以使用泛型来实现类型安全。

关于java - 如何使用 JakeWharton 的 DiskLruCache 正确读写数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20819226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com