Чтение объектов из файла во входной поток

В настоящее время я работаю над простым ObjectInputStream а также ObjectOutputStream Я прочитал и документацию, и учебник по Java, и знаком с основами; однако, пытаясь скомпилировать мою программу, я сталкиваюсь с ошибкой, которая может быть связана с моим неправильным пониманием комбинации Map s и Объект ввода / вывода, в частности, часть ввода.

У меня есть файл.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 = часть. Я не уверен, является ли это сложной проблемой или это одна из двух проблем:

  1. Я неправильно собираю данные из файла, чтобы заполнить TreeMap
  2. Я неправильно понимаю реализацию ObjectInputStream

1 ответ

Решение

Похоже, вы изначально написали 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...
}

Конечно, это вызовет исключение, когда оно достигнет конца потока - вы можете подумать о том, как вы будете обнаруживать это чисто, а не просто обрабатывать исключение.

Другие вопросы по тегам