如何将Java序列化的对象写入和读取到文件中

2021/01/17 00:31 · java ·  · 0评论

我将多个对象写入文件,然后在代码的另一部分中检索它们。我的代码没有错误,但是无法正常工作。您能帮我发现我的代码有什么问题吗?我从不同的网站阅读了不同的代码,但是没有一个对我有用!

这是将对象写入文件的代码:MyClassList是一个数组列表,其中包含我的类的对象(必须将其写入文件)。

for (int cnt = 0; cnt < MyClassList.size(); cnt++) {
    FileOutputStream fout = new FileOutputStream("G:\\address.ser", true);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(MyClassList.get(cnt));
}

我向输出流的构造函数添加了“ true”,因为我想将每个对象都添加到文件的末尾。那是对的吗?

这是我从文件中读取对象的代码:

 try {
     streamIn = new FileInputStream("G:\\address.ser");
     ObjectInputStream objectinputstream = new ObjectInputStream(streamIn);
     MyClass readCase = (MyClass) objectinputstream.readObject();
     recordList.add(readCase);
     System.out.println(recordList.get(i));
 } catch (Exception e) {
     e.printStackTrace();
 }

最后,它仅打印出一个对象。现在,我不知道我书写或阅读不正确!

为什么不立即序列化整个列表?

FileOutputStream fout = new FileOutputStream("G:\\address.ser");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(MyClassList);

当然,假设MyClassList是一个ArrayListorLinkedList或另一个Serializable集合。

在将其读回的情况下,在您的代码中仅准备了一项,就没有循环来收集所有写入的项。

正如其他人所建议的,您可以一次序列化和反序列化整个列表,这更简单,并且似乎完全符合您的意图。

在这种情况下,序列化代码变为

ObjectOutputStream oos = null;
FileOutputStream fout = null;
try{
    fout = new FileOutputStream("G:\\address.ser", true);
    oos = new ObjectOutputStream(fout);
    oos.writeObject(myClassList);
} catch (Exception ex) {
    ex.printStackTrace();
} finally {
    if(oos != null){
        oos.close();
    } 
}

反序列化就变成了(假设myClassList是一个列表,并希望您将使用泛型):

ObjectInputStream objectinputstream = null;
try {
    FileInputStream streamIn = new FileInputStream("G:\\address.ser");
    objectinputstream = new ObjectInputStream(streamIn);
    List<MyClass> readCase = (List<MyClass>) objectinputstream.readObject();
    recordList.add(readCase);
    System.out.println(recordList.get(i));
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if(objectinputstream != null){
        objectinputstream .close();
    } 
}

您还可以按照以下步骤从文件中反序列化几个对象:

ObjectInputStream objectinputstream = null;
try {
    streamIn = new FileInputStream("G:\\address.ser");
    objectinputstream = new ObjectInputStream(streamIn);
    MyClass readCase = null;
    do {
        readCase = (MyClass) objectinputstream.readObject();
        if(readCase != null){
            recordList.add(readCase);
        } 
    } while (readCase != null)        
    System.out.println(recordList.get(i));
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if(objectinputstream != null){
        objectinputstream .close();
    } 
}

请不要忘记在finally子句中关闭流对象(注意:它可能引发异常)。

编辑

如注释中所建议,最好将try与资源一起使用并且代码应该变得非常简单。

这是列表序列化:

try(
    FileOutputStream fout = new FileOutputStream("G:\\address.ser", true);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
){
    oos.writeObject(myClassList);
} catch (Exception ex) {
    ex.printStackTrace();
}

简单的程序,可将对象写入文件并从文件读取对象。

package program;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TempList {

  public static void main(String[] args) throws Exception {
    Counter counter = new Counter(10);

    File f = new File("MyFile.txt");
    FileOutputStream fos = new FileOutputStream(f);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(counter);
    oos.close();

    FileInputStream fis = new FileInputStream(f);
    ObjectInputStream ois = new ObjectInputStream(fis);
    Counter newCounter = (Counter) ois.readObject();
    System.out.println(newCounter.count);
    ois.close();
  }

}

class Counter implements Serializable {

  private static final long serialVersionUID = -628789568975888036 L;

  int count;

  Counter(int count) {
    this.count = count;
  }
}

运行该程序后,控制台窗口中的输出将为10,您可以通过单击下图所示的图标在Test文件夹中找到该文件。

在此处输入图片说明

我认为您必须将每个对象写入一个自己的文件,或者在读取文件时将其拆分。您还可以尝试序列化列表,并在反序列化时检索该列表。

如果序列化整个列表,则在读回文件时还必须将文件反序列化为列表。这意味着您将不可避免地在内存中加载一个大文件。可能很贵。如果您有一个大文件,并且需要逐行将其分块(->逐个对象),则继续您的最初想法

序列化:

LinkedList<YourObject> listOfObjects = <something>;
try {
    FileOutputStream file = new FileOutputStream(<filePath>);
    ObjectOutputStream writer = new ObjectOutputStream(file);
    for (YourObject obj : listOfObjects) {
        writer.writeObject(obj);
    }
    writer.close();
    file.close();
} catch (Exception ex) {
    System.err.println("failed to write " + filePath + ", "+ ex);
}

反序列化:

try {
    FileInputStream file = new FileInputStream(<filePath>);
    ObjectInputStream reader = new ObjectInputStream(file);
    while (true) {
        try { 
            YourObject obj = (YourObject)reader.readObject();
            System.out.println(obj)
        } catch (Exception ex) {
            System.err.println("end of reader file ");
            break;
        }
    }
} catch (Exception ex) {
    System.err.println("failed to read " + filePath + ", "+ ex);
}
本文地址:http://java.askforanswer.com/ruhejiangjavaxuliehuadeduixiangxieruheduqudaowenjianzhong.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!