使用 Java 从 .dat 文件中读取对象

Posted

技术标签:

【中文标题】使用 Java 从 .dat 文件中读取对象【英文标题】:Reading objects from a .dat file using Java 【发布时间】:2020-10-31 17:37:04 【问题描述】:

我在 .dat 文件中有 3 个 Fraction 类型的对象,我正在尝试使用 Java 读取 .dat 文件的内容。

通过下面的代码块,我不断得到:

线程 "main" java.lang.ClassCastException 中的异常:类 Fraction 不能转换为类 [LFraction; (Fraction 和 [LFraction; 位于加载程序“app”的未命名模块中)
    在 Mod8Problem1.main(Mod8Problem1.java:26)

我尝试了一些方法,但总是遇到同样的异常。解决此问题的最佳方法是什么?

try(
        ObjectInputStream input = new ObjectInputStream(new FileInputStream("SerialF.dat"))
) 
    Fraction[] updatedFractions = (Fraction[]) (input.readObject());

    for (int i = 0; i < updatedFractions.length; i++) 
        System.out.println(updatedFractions[i]);
    
      

【问题讨论】:

您正在尝试反序列化 Fraction,但您用来引用它的变量是 Fraction[]。您需要单独循环读取每个 Fraction 对象; readObject() 正在返回 Fraction,而不是 Fraction[] @Dioxin 你能帮我理解为什么这段代码有效吗:try (ObjectInputStream input = new ObjectInputStream(new FileInputStream("array.dat")); ) int[] numbers = (int []) (input.readObject()); 因为array.dat 被序列化为数组。数组是对象,可以序列化。但是,SerialF 不是序列化数组。将多个对象写入同一个文件与序列化数组不同。听起来像SerialF 将多个对象序列化到同一个文件,而array 只是序列化一个数组(一个对象)。 您在问题中写道:我在 .dat 中有 3 个 Fraction 类型的对象 不,您没有。您只能在 java 中序列化单个对象,但是该单个对象可能是 Collection 或数组,换句话说,单个对象包含多个其他对象。 SerialF.dat 文件是如何创建的? 【参考方案1】:

你的问题在这里:

Fraction[] updatedFractions = (Fraction[]) (input.readObject());

input.readObject() 返回Fraction,但您试图将其转换为Fraction[],这不是兼容的类型。不过,您可以将多个 Fractions 读入一个数组以获得相同的结果。您可以使用ArrayList 来执行此操作,如下所示:

ArrayList<Fraction> fractions = new ArrayList<>();

try (
    ObjectInputStream input = new ObjectInputStream(new FileInputStream("SerialF.dat"))
) 
    while (input.available() > 0) 
        fractions.add((Fraction) input.readObject);
        
    


Fraction[] updatedFractions = fractions.toArray(new Fraction[0]);

for (Fraction fraction : updatedFractions) 
    System.out.println(fraction);

【讨论】:

以上是关于使用 Java 从 .dat 文件中读取对象的主要内容,如果未能解决你的问题,请参考以下文章

Java保存功能不会覆盖

Java中从文件中读取数据用啥函数

java从文件读取对象

java使用ObjectInputStream从文件中读取对象

Java 从 ZipEntry 对象中读取指定文件

如何从 Java 文件中读取许多 json 对象?