Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JakeWharton'正确读取和写入数据;那是迪克鲁卡什吗?_Java_Android - Fatal编程技术网

Java 如何使用JakeWharton'正确读取和写入数据;那是迪克鲁卡什吗?

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

我试图在我的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();
        }
}
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,我不知道它以整数参数值作为字节。