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