从文件读取对象到输入流

时间:2014-06-29 18:40:24

标签: java objectinputstream treemaps

我目前正在制作一个简单的ObjectInputStreamObjectOutputStream,我已经阅读了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错误):

Screenshot of Error Message

以下是我将Product个对象写入.dat文件的方法:

try (ObjectOutputStream outputStream = new ObjectOutputStream(new    FileOutputStream(fileName))) {
    for (int i = 0; i < products.size(); i++) {
        outputStream.writeObject(products.get(i));
    }
}

隔离了错误,我知道当我点击products =部分时会发生错误。我不确定这是否是一个复合问题,或者这是两个问题之一:

  1. 我没有正确抓取文件中的数据以填充TreeMap
  2. 我误解了ObjectInputStream
  3. 的实施

1 个答案:

答案 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...
}

当然,当它到达流的末尾时会抛出异常 - 您可能想要考虑如何干净地检测它而不仅仅是处理异常。