如何在Java中将对象读写到文本文件中?

5

我有一个对象数组,想将它们写入文本文件。这样我以后就可以读取对象并转换为数组。应该如何做呢?使用序列化。

反序列化不起作用:

public static void readdata(){
        ObjectInputStream input = null;
        try {
            input = new ObjectInputStream(new FileInputStream("myfile.txt")); // getting end of file exception here
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        try {
            array = (players[]) input.readObject(); // null pointer exception here
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        readdata();
        writedata();
    }

2
阅读关于序列化的内容并应用。 - Prashant
读取文件时遇到问题,写入操作正常。 - Sam
将数组包装在另一个对象中。 - Mohammad Jafar Mashhadi
@Shivam,你试过像我建议的那样将数组包装在另一个对象中吗?虽然我没有测试过,但我相信它可以工作。 - Mohammad Jafar Mashhadi
序列化数据不是文本。你的异常处理结构很差,这是所有问题的根源。与try块中的代码一起成功的代码应该在同一个try块内。你无法同时获得文件结束和空指针异常。 - user207421
显示剩余2条评论
2个回答

4

将对象转换为字符串或反之的过程称为序列化和反序列化。要对一个对象进行序列化,它应该实现 Serializable 接口。大多数内置数据类型和数据结构默认是可序列化的,只有一些类不可序列化(例如 Socket 不可序列化)。

因此,首先应该让你的类成为可序列化的:

 class Student implements java.io.Serializable {
     String name;
     String studentId;
     float gpa;
     transient String thisFieldWontBeSerialized;
 }

您可以使用 ObjectOutputStream 对其进行序列化并写入文件:
public class Writer {
    static void writeToFile(String fileName, Student[] students) throws IOException {
        File f = new File(fileName);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
        oos.writeObject(students);
        oos.flush();
        oos.close();
    }
}

ObjectInputStream可以类似地用来从文件中读取数组。


0
据我所知,Java没有为任意对象提供一种简单的方法来实现序列化。因此,考虑将自己限制在一个Serializable数组中。
如果您要处理的对象是您自己的类,并且因此希望这些类实现java.io.Serializable接口,请仔细阅读它所附带的'合同', 因为并不是所有您必须保证的类都会在编译时自动执行。 (因此,如果您的类实现了Serializable而没有完全遵循其条件,则可能会出现运行时错误或仅出现“错误”的运行时行为,可能很难检测。)
(另请参见这些最佳实践。)

我遇到了文件结尾异常和空指针异常。ObjectInputStream input = null; input = new ObjectInputStream(new FileInputStream("myfile.txt")); // 这里是文件末尾 array = (players[]) input.readObject(); // 这里是空指针这里出了什么问题? - Sam
代码在注释中并不是很清晰可读。如果合适的话,请考虑将其编辑到您的问题中或提出一个新的问题。 - das-g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接