Чтение объектов из файла во входной поток
В настоящее время я работаю над простым 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 =
часть. Я не уверен, является ли это сложной проблемой или это одна из двух проблем:
- Я неправильно собираю данные из файла, чтобы заполнить
TreeMap
- Я неправильно понимаю реализацию
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...
}
Конечно, это вызовет исключение, когда оно достигнет конца потока - вы можете подумать о том, как вы будете обнаруживать это чисто, а не просто обрабатывать исключение.