java-如何使用JakeWharton的DiskLruCache正确读取和写入数据?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何使用JakeWharton的DiskLruCache正确读取和写入数据?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2295字,纯文字阅读大概需要4分钟。
内容图文
我正在尝试在我的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(list)替换dataOos.writeObject(str)不起作用.我试过了ArrayLists和HashMaps,看来它们没有被序列化并写入缓存.该程序执行所有代码,然后挂起一分钟左右,然后返回,仅将日志文件保留在缓存目录中.
我不确定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且快照== null,导致测试失败.但是,如果我在第103行放置一个断点(DiskLruCache.Snapshot snapshot = mDiskLruCache.get(“ test-store-array-list”);),该文件将按预期创建.
DiskLruCache中可能存在错误;是否有其他兼容Android的磁盘缓存库?
解决方法:
问题是缓存大小太小.
我通过更改此方法解决了该问题:
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.
内容总结
以上是互联网集市为您收集整理的java-如何使用JakeWharton的DiskLruCache正确读取和写入数据?全部内容,希望文章能够帮你解决java-如何使用JakeWharton的DiskLruCache正确读取和写入数据?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。