Как писать и читать java-сериализованные объекты в файл

Я собираюсь написать несколько объектов в файл, а затем восстановить их в другой части моего кода. У моего кода нет ошибок, но он работает неправильно. Не могли бы вы помочь мне найти, что не так в моем коде. Я читал разные коды с разных сайтов, но никто из них не работал для меня!

Вот мой код для записи моих объектов в файл: MyClassList – это arraylist, который включает объекты моего classа (которые должны быть записаны в файл).

for (int cnt = 0; cnt < MyClassList.size(); cnt++) { FileOutputStream fout = new FileOutputStream("G:\\address.ser", true); ObjectOutputStream oos = new ObjectOutputStream(fout); oos.writeObject(MyClassList.get(cnt)); } 

Я добавил «true» к конструктору выходного streamа, потому что я хочу добавить каждый объект в конец файла. Это верно?

И вот мой код для чтения объектов из файла:

  try { streamIn = new FileInputStream("G:\\address.ser"); ObjectInputStream objectinputstream = new ObjectInputStream(streamIn); MyClass readCase = (MyClass) objectinputstream.readObject(); recordList.add(readCase); System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); } 

Он, наконец, печатает только один объект. Теперь я не знаю, правильно ли я пишу или правильно читаю!

Почему бы не сериализовать весь список сразу?

 FileOutputStream fout = new FileOutputStream("G:\\address.ser"); ObjectOutputStream oos = new ObjectOutputStream(fout); oos.writeObject(MyClassList); 

Предполагая, конечно, что MyClassList является ArrayList или LinkedList или другой коллекцией Serializable .

В случае чтения его обратно, в вашем коде вы готовы только один элемент, нет петли, чтобы собрать весь написанный элемент.

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

В этом случае код сериализации становится

 ObjectOutputStream oos = null; FileOutputStream fout = null; try{ fout = new FileOutputStream("G:\\address.ser", true); oos = new ObjectOutputStream(fout); oos.writeObject(myClassList); } catch (Exception ex) { ex.printStackTrace(); } finally { if(oos != null){ oos.close(); } } 

И десериализация становится (при условии, что myClassList – это список и надеется, что вы будете использовать дженерики):

 ObjectInputStream objectinputstream = null; try { FileInputStream streamIn = new FileInputStream("G:\\address.ser"); objectinputstream = new ObjectInputStream(streamIn); List readCase = (List) objectinputstream.readObject(); recordList.add(readCase); System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); } finally { if(objectinputstream != null){ objectinputstream .close(); } } 

Вы также можете десериализовать несколько объектов из файла, как вы планировали:

 ObjectInputStream objectinputstream = null; try { streamIn = new FileInputStream("G:\\address.ser"); objectinputstream = new ObjectInputStream(streamIn); MyClass readCase = null; do { readCase = (MyClass) objectinputstream.readObject(); if(readCase != null){ recordList.add(readCase); } } while (readCase != null) System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); } finally { if(objectinputstream != null){ objectinputstream .close(); } } 

Не забудьте закрыть объекты streamа в предложении finally (примечание: оно может генерировать исключение).

РЕДАКТИРОВАТЬ

Как было предложено в комментариях, предпочтительнее использовать try с ресурсами, и код должен стать более простым.

Вот сериализация списка:

 try( FileOutputStream fout = new FileOutputStream("G:\\address.ser", true); ObjectOutputStream oos = new ObjectOutputStream(fout); ){ oos.writeObject(myClassList); } catch (Exception ex) { ex.printStackTrace(); } 

Я думаю, вы должны написать каждый объект в собственный файл, или вам нужно разбить его при чтении. Вы также можете попытаться сериализовать свой список и получить его при десериализации.

если вы сериализуете весь список, вам также необходимо де-сериализовать файл в списке, когда вы его прочитаете. Это означает, что вы неизбежно загрузите в память большой файл. Это может быть дорого. Если у вас большой файл, и вам нужно его разбить по строкам (-> объект по объекту), просто приступайте к своей первоначальной идее .

Сериализация:

 LinkedList listOfObjects = ; try { FileOutputStream file = new FileOutputStream(); ObjectOutputStream writer = new ObjectOutputStream(file); for (YourObject obj : listOfObjects) { writer.writeObject(obj); } writer.close(); file.close(); } catch (Exception ex) { System.err.println("failed to write " + filePath + ", "+ ex); } 

Десериализация:

 try { FileInputStream file = new FileInputStream(); ObjectInputStream reader = new ObjectInputStream(file); while (true) { try { YourObject obj = (YourObject)reader.readObject(); System.out.println(obj) } catch (Exception ex) { System.err.println("end of reader file "); break; } } } catch (Exception ex) { System.err.println("failed to read " + filePath + ", "+ ex); } 
  • c ++ шаблон и файлы заголовков
  • Изменить текст по умолчанию в типе ввода = «файл»?
  • Как сохранить загруженный файл в JSF
  • Элегантный способ чтения файла в массив byte в Java
  • Android; Проверьте, существует ли файл без создания нового
  • Как преобразовать InputStream в виртуальный файл
  • Загрузка файлов через AJAX в JQuery
  • найти разницу между двумя текстовыми файлами с одним элементом на строку
  • Как проверить файл, если он существует с шаблоном в Java?
  • Как я могу получить размер файла в C?
  • Изменение поведения отступа Vim по типу файла
  • Interesting Posts

    Создание виртуальной машины в VirtualBox из существующей установки Ubuntu

    Установка старой версии пакета R

    Не удается установить пакет .bin на Ubuntu

    O (n), чтобы найти медиану набора чисел

    Инъекция зависимости: Черепахи полностью вниз?

    Когда объект «выходит за frameworks»?

    Слишком много текста для ячейки Excel – как сделать прокручиваемую ячейку

    Насколько точна Thread.Sleep (TimeSpan)?

    Есть ли способ, которым я могу поделиться 3,42 ГБ загрузки Windows 8.1 из Windows Store?

    Конвейер ресурсов Rails 3.1: как загрузить скрипты, специфичные для controllerа?

    Как вы находите родительский процесс зомби-процесса?

    Как передать Bundle из fragmentа в fragment

    Добавление атрибутов проверки с помощью модели данных Entity Framework

    Код элемента Entity Framework (EF) Первый каскадный вывод для отношения «один к нулю» или «один»

    Android продолжает кэшировать мои намерения. Дополнительно, как объявить ожидающее намерение, которое содержит свежие дополнения?

    Давайте будем гением компьютера.