#java #inputstream #objectinputstream
#Ява #входной поток #поток ввода объекта
Вопрос:
Я пытаюсь читать и записывать объекты формы в файл для программы рисования, но когда я пытаюсь прочитать из файла, он показывает, что файл пуст. Файл определенно записывается и обновляется, но при попытке чтения из файла он показывает, что доступно ноль байтов. Класс shape сериализуем, поэтому я не уверен, почему это вообще не работает.
public void writeToFile() { try { FileOutputStream fileOut = new FileOutputStream("C:\Users\johnm\eclipse-workspace\CSE205_Assignment05\save.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); for (Shape item : shapes) { out.writeObject(item); } out.close(); fileOut.close(); System.out.println("Serialized data is saved in output.ser"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void loadFromFile() { boolean cont = true; Shape shape = null; int count = 0; while (cont) { try { FileInputStream fileIn = new FileInputStream("C:\Users\johnm\eclipse-workspace\CSE205_Assignment05\save.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); System.out.println(in.available() " Bytes"); if (in.available() != 0) { shape = (Shape) in.readObject(); if (shape != null) { shapes.add(shape); count ; } else { System.out.println("Shape is null"); } } else { cont = false; } in.close(); fileIn.close(); System.out.println("Deserialized " count " Objects"); } catch (ClassNotFoundException c) { System.out.println("Class not found"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Ответ №1:
Хорошо, по какой-то причине метод .available() не показывает никаких байтов, независимо от того, есть ли они на самом деле или нет. Чтобы противостоять этому, я просто добавил еще один оператор try/catch, в котором он непрерывно считывает объекты, пока не попадет в исключение EOFException и не поймает себя.
Мой код в конечном итоге выглядел так, как когда-то работал.
public void loadFromFile() { //** Loads set of shape objects from file Shape shape = null; int count = 0; try { FileInputStream fileIn = new FileInputStream("save.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); System.out.println(in.available() " Bytes"); try { while (true) { shape = (Shape) in.readObject(); if (shape != null) { shapes.add(shape); count ; } else { System.out.println("Shape is null"); } } } catch (EOFException e) { System.out.println("End of file exception"); } in.close(); fileIn.close(); System.out.println("Deserialized " count " Objects"); repaint(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }