使用 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[]
,这不是兼容的类型。不过,您可以将多个 Fraction
s 读入一个数组以获得相同的结果。您可以使用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 文件中读取对象的主要内容,如果未能解决你的问题,请参考以下文章