【问题标题】:Reading objects from a .dat file using Java使用 Java 从 .dat 文件中读取对象
【发布时间】: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 文件是如何创建的?

标签: java serializable


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多