Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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序列化对象?_Java_Android_Serialization - Fatal编程技术网

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

读取已拆分为两个文件的Java序列化对象?,java,android,serialization,Java,Android,Serialization,我正在写一个Android应用程序。一个问题是你的应用程序不能包含未压缩大小大于1Mb的文件。我有一个要加载的序列化对象,总容量约为2Mb。我的计划是将此文件拆分为两个较小的文件,然后在运行时通过合并这两个文件来加载对象 但是,我无法确定如何使用例如InputStream和ObjectInputStream来指定我要从两个输入流读取数据。我该怎么做 例如,假设我的对象在文件O1和O2之间分割。我怎么能说“先从O1读取数据,然后再从O2读取数据来加载对象”ObjectInputStream只是将I

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

但是,我无法确定如何使用例如InputStream和ObjectInputStream来指定我要从两个输入流读取数据。我该怎么做


例如,假设我的对象在文件O1和O2之间分割。我怎么能说“先从O1读取数据,然后再从O2读取数据来加载对象”

ObjectInputStream
只是将
InputStream
放在它的构造函数中,所以很明显,任务是实现一个
InputStream
具体的子类,它按顺序读取两个文件(而不是像
FileInputStream
那样只读取一个文件)。基本上,您的具体子类必须通过委托给第一个来实现,然后(当委托用尽时)委托给它作为属性保存的两个
FileInputStream
s中的第二个(将它们传递到具体子类的构造函数中)。

ObjectInputStream
只接受其构造函数中的
InputStream
,很明显,任务是实现一个
InputStream
具体的子类,该子类按顺序读取两个文件(而不是像
FileInputStream
那样只读取一个文件)。基本上,您的具体子类必须通过将其作为属性保存的两个
FileInputStream
s中的第一个委托给具体子类,然后(当委托用尽时)第二个委托给具体子类来实现(将它们传递给您的具体子类的构造函数)。

如注释中所述,您应该能够使用Java的内置类来反序列化跨多个文件拆分的对象。这种方法还允许反序列化跨任意数量的文件拆分的对象,因为
SequenceInputStream
的构造函数接受两个
InputStream
对象,其中一个可以是另一个
SequenceInputStream

我创建了一个可以在Android上运行的小示例,尽管我只在桌面Java安装上进行了测试。本示例的工作假设您已序列化了类型为
Foo
的对象,并将序列化版本拆分为两个文件名
myobj.part1
myobj.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) { }
    }
}
正如注释中指出的,您应该能够使用Java的内置类来反序列化一个被拆分为多个文件的对象。这种方法还允许反序列化跨任意数量的文件拆分的对象,因为
SequenceInputStream
的构造函数接受两个
InputStream
对象,其中一个可以是另一个
SequenceInputStream

我创建了一个可以在Android上运行的小示例,尽管我只在桌面Java安装上进行了测试。本示例的工作假设您已序列化了类型为
Foo
的对象,并将序列化版本拆分为两个文件名
myobj.part1
myobj.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) { }
    }
}

在Java中,您可以简单地使用
Java.io.SequenceInputStream
。不知道安卓。另一个解决方案可能是再次压缩流,但对平台隐藏。(顺便说一句,你可能想更改你的标签。)@Tom:看起来Android SDK确实包含了
java.io.SequenceInputStream
()的实现。为什么不发布一个答案,这样你就可以获得一些声誉呢?@Tom:我发布了一个答案,并举了一个例子。希望你不介意@William我已经对它进行了升级。在Java中,您可以简单地使用
Java.io.SequenceInputStream
。不知道安卓。另一个解决方案可能是再次压缩流,但对平台隐藏。(顺便说一句,你可能想更改你的标签。)@Tom:看起来Android SDK确实包含了
java.io.SequenceInputStream
()的实现。为什么不发布一个答案,这样你就可以获得一些声誉呢?@Tom:我发布了一个答案,并举了一个例子。希望你不介意@William我已经对它进行了升级。我考虑过这样做,但我原以为这个功能会隐藏在某个地方。如果我能帮忙的话,我不想写一个新类。如果你的Android SDK中有
SequenceInputStream
(对不起,没有要检查的),那就是你正在寻找的预定义实现,Tom的评论和William的回答也表明了这一点。我考虑过这样做,但我原以为这个功能会隐藏在某个地方。如果我能帮忙的话,我不想写一个新类。如果你的Android SDK中有
SequenceInputStream
(对不起,没有要检查的),那就是你正在寻找的预定义实现,Tom的评论和William的回答也表明了这一点。