读取已分割为两个文件的Java序列化对象?

时间:2010-03-02 02:05:25

标签: java android serialization

我正在编写一个Android应用程序。一个问题是您的应用程序不能包含未压缩大小大于1Mb的文件。我有一个序列化的对象,我想加载总共大约2Mb。我的计划是将此文件拆分为两个较小的文件,然后在运行时通过组合这两个文件来加载对象。

然而,我无法弄清楚如何使用,例如InputStream和ObjectInputStream指定我想从两个输入流中读取数据。我怎么能这样做?

例如,假设我的对象在文件O1和O2之间分开。我怎么说“通过从O1读取数据然后从O2加载对象”?

2 个答案:

答案 0 :(得分:3)

在注释中指出Tom Hawtin,您应该能够使用Java的内置SequenceInputStream类来反序列化分散在多个文件中的对象。此方法还允许您对跨任意数量文件的对象进行反序列化,因为SequenceInputStream的构造函数接受两个InputStream个对象,其中一个可能是另一个SequenceInputStream

我创建了一个应该在Android上运行的小例子,尽管我只在桌面Java安装上测试过它。该示例的前提是您已序列化了Foo类型的对象,并将序列化版本拆分为两个文件名myobj.part1myobj.part2

这个例子非常自我解释,但如果您有任何疑问,请告诉我。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.SequenceInputStream;

...

ObjectInputStream in = null;

try {
    in = new ObjectInputStream(
        new SequenceInputStream(
                new FileInputStream("myobj.part1"),
                new FileInputStream("myobj.part2")));

    Foo foo = (Foo) in.readObject();

    // Do something with the deserialized object...
    foo.doSomething();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (in != null) {
        try { 
            in.close();
        } catch (IOException e) { }
    }
}

答案 1 :(得分:1)

ObjectInputStream只需要在其构造函数中使用InputStream,所以很明显,该任务正在实现一个InputStream具体子类,它按顺序读取两个文件(而不只是一个{{1} })。基本上你的具体子类必须通过委托给第一个来实现read(byte[]),然后(当它用尽时)它作为属性保存的两个FileInputStream中的第二个(将它们传递给你的具体子类的构造函数)。