我尝试在序列化后在java中的文件中编写对象。目前,我正在使用writeObject()
方法。使用readObject()读取对象总是返回第一个对象。我不确定这是否是原因,但我每次写文件时都没有创建新对象,我只是重置现有对象的值并调用writeObject(obj)。
Student s1 = new Student(1,2);
// Assume I need to create an output file test.txt which has objects written to it.
ObjectOutputStream out = new ObjectOutputStream(new FileWriter("test.txt"));
int i=0;
while ( i < MAX ) {
s1.x = i;
s1.y = i*10; // assume that the student class has two fields x and y
out.writeObject(s1);
i++;
}
现在当我调用readObject()
时,它总是返回插入的第一个对象的值。可能是因为Object流通过保存对表中对象的引用来工作,而我不是每次都创建新对象,这是原因吗?
然后我google了很多,并阅读了ObjectStream的行为。所以,我使用writeUnshared()
方法进行编写,并能够读取每个对象。但是这种情况下的内存消耗是以GB为单位写入大量对象(10 ^ 9或更多)(也需要超过5分钟左右)。
我读到的其他答案说在将对象写入文件后使用reset()
。这会重置我的流,但现在输出文件的大小变得非常大。正如我所观察到的,当对象数量非常大(比如大约2 GB的输入对象)时,会创建5 GB的文件。
在这种情况下可以做些什么?由于性能问题,我认为我无法使用writeUnshared()
和reset()
。如果我仅使用writeObject()
进行写入,他们如何才能执行对象的读取。任何替代方案也受到欢迎。
或者做类似工作的任何其他方法都可以完成这项工作。在我读到的时候,我听说过其他的序列化程序,如XML,JSON,Java的一些Kryo以及许多其他的。但我担心那些性能(内存和输出大小)。