在java中读取和写入文件中的对象

在java中读取和写入文件中的对象,java,object,serialization,Java,Object,Serialization,在序列化对象之后,我尝试用java将它们写入文件中。目前,我正在使用writeObject()方法。使用readObject()读取对象总是返回第一个对象。我不确定这是否是原因,但我不是每次写入文件时都创建新对象,我只是重置现有对象的值并调用writeObject(obj) Student s1=新生(1,2); //假设我需要创建一个输出文件test.txt,其中写入了对象。 ObjectOutputStream out=新的ObjectOutputStream(新的FileWriter(“t

在序列化对象之后,我尝试用java将它们写入文件中。目前,我正在使用
writeObject()
方法。使用readObject()读取对象总是返回第一个对象。我不确定这是否是原因,但我不是每次写入文件时都创建新对象,我只是重置现有对象的值并调用writeObject(obj)

Student s1=新生(1,2);
//假设我需要创建一个输出文件test.txt,其中写入了对象。
ObjectOutputStream out=新的ObjectOutputStream(新的FileWriter(“test.txt”);
int i=0;
而(i
现在,当我调用
readObject()
时,它总是返回插入的第一个对象的值。可能是因为对象流通过在表中保存对对象的引用来工作,而我不是每次都创建新对象,这就是原因吗

然后我在谷歌上搜索了很多关于ObjectStream行为的信息。因此,我使用了
writeUnshared()
方法进行写入,并能够读取每个对象。但在这种情况下,当写入大量对象(10^9或更多)时,内存消耗以GB为单位(也需要5分钟左右)

我读到的进一步答案是在将对象写入文件后使用
reset()
。这会重置我的流,但现在输出文件的大小变得非常大。正如我观察到的,当对象的数量非常大(比如说大约2GB的输入对象)时,就会创建5GB的文件

在这种情况下可以做什么?由于性能问题,我想我不能使用
writeUnshared()
reset()
。如果我只使用
writeObject()
进行写入,那么如何执行对象的读取。也欢迎任何替代方案。
或者任何其他做类似工作的方法都可以做这项工作。在阅读时,我听说了其他序列化程序,如XML、JSON、java的一些Kryo和许多其他序列化程序。但我担心的是它们的性能(内存和输出大小)

我不鼓励使用二进制序列化。我想最好是序列化为XML或JSON。您还应在问题中添加一个。您已正确确定原因。查看一下
ObjectOutputStream.reset()
@EJP那么,我能否得出结论,文件的大尺寸是因为outputstream每次都被重置,因为每个具有新流相关信息的对象都被写入文件?如果是的话,还有其他选择吗?@Fildor补充了一些解释。此外,序列化为XML或JSON时,对象具有1或2个浮点值和整数值时,预期的输出大小是多少。如果对象的数量很大(10^7或更多),该怎么办。与当前的可序列化技术相比,它不是更重要吗?如果您关心大小,那么您根本不应该使用文件。考虑使用DB进行持久化。
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++;
}