我目前正在制作一个简单的ObjectInputStream
和ObjectOutputStream
,我已经阅读了documentation和Java tutorial,并熟悉基础知识;但是,在尝试编译我的程序时,我遇到的错误可能与我对 Map
和对象输入/输出的组合的误解有关,特别是输入部分。
我有一个.dat文件,我试图从中读取映射到TreeMap
的对象列表:
public class Product implements Serializable
{
private static final long serialVersionUID = 1L;
private int code;
private String name;
private int quatity;
// Setters and Getters
}
上面是Product
对象本身的代码片段 - 实现Serializable
。我将片段包含在问题所在的地方。
对于这个问题,假设.dat不为空并且包含格式正确的数据。
这是我的ObjectInputStream
代码:
try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file))) {
while (true) {
try {
products = (Map<Integer, Product>) inputStream.readObject();
}
catch (ClassNotFoundException cnfException {
System.out.println("ClassNotFoundException: " + cnfException.getMessage());
}
catch (EOFException eofException) {
System.err.println("EOFException: " + eofException.getMessage());
}
}
尝试运行此代码时,出现以下错误(Cast错误):
以下是我将Product
个对象写入.dat文件的方法:
try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(fileName))) {
for (int i = 0; i < products.size(); i++) {
outputStream.writeObject(products.get(i));
}
}
隔离了错误,我知道当我点击products =
部分时会发生错误。我不确定这是否是一个复合问题,或者这是两个问题之一:
TreeMap
ObjectInputStream
答案 0 :(得分:2)
听起来您最初只是将Product
个对象写入ObjectOutputStream
,而不是Map<Integer, Product>
。如果是这种情况,您需要以下内容:
Map<Integer, Product> products = new TreeMap<>();
try (ObjectInputStream input = new ObjectInputStream(new FileInputStream(file))) {
while (true) {
Product product = (Product) input.readObject();
products.put(product.getCode(), product); // Or whatever
}
} catch (EOFException e) {
// Just finish? Kinda nasty...
}
当然,当它到达流的末尾时会抛出异常 - 您可能想要考虑如何干净地检测它而不仅仅是处理异常。