Java: сохранить объекты в текстовом файле? Есть ли готовые решения?

Я хочу сохранить объекты, которые я создал в программе. После перезагрузки приложение должно автоматически загружать все объекты в массив. Я хочу записать их в файл и проанализировать их после перезагрузки. Есть ли другие возможности умнее, чем сделать это вручную? Спасибо

8 ответов


можно использовать Berkeley DB PersistentMap класс для сохранения вашего (Serializable) объекты в Map реализация (кэш), которая сохраняет их в файле. Он довольно прост в использовании и означает, что вам не нужно беспокоиться о том, что сохранить где.

три вещи, чтобы отметить о сериализации:

  1. как вы собираетесь справляться с изменениями схемы (т. е. изменять данные, из которых состоят ваши классы - например, добавление нового поля)
  2. что произойдет, если ваш файл(ы) поврежден? В зависимости от того, насколько надежным должно быть хранилище вашей программы, это повлияет на ваше решение о сохранении данных, неявно содержащихся в объектах. Помните, что вы всегда можете использовать реляционную базу данных, такую как в MySQL и затем преобразовать эти данные в объекты
  3. вам нужно иметь возможность просматривать или запрашивать данные за пределами программы? Что делать, если вы хотите ответить на простой вопрос: "сколько объект имеет свойство X?"Легко сделать, если вы использовали (реляционную) базу данных; не так просто, если вы сериализовали материал в файлы!

ДА, концепция, которую вы ищете, называется сериализацией. Есть прекрасный учебник в Sun здесь.

идея заключается в том, что классы, которые вы хотите сохранить, должны реализовать интерфейс Serializable. После этого вы используете java.Ио.ObjectOutputStream.writeObject () для записи объекта в файл и java.Ио.ObjectInputStream.readObject (), чтобы прочитать его обратно.

вы не можете сериализовать все, так как есть вещи, которые не имеют смысла сериализовать, но вы может обойти их. Вот цитата об этом:

основной механизм Java сериализация проста в использовании, но есть еще кое-что, что нужно знать. Как упоминалось ранее, только объекты, отмеченные Сериализуемый может быть сохранен. Этот Ява.ленг.Класс Object не реализовать этот интерфейс. Следовательно, не все объекты в Java может быть сохраняется автоматически. Хорошая новость это большинство из них-как AWT и Компоненты GUI Swing, строки и матрицы -- являются сериализуемыми.

с другой стороны, определенные классы системного уровня, такие как Thread, OutputStream и его подклассы, и Сокет не сериализуется. Действительно, это не имело бы никакого смысла, если они были. Например, поток, выполняющийся в мой JVM будет использовать мою систему память. Сохранение и пытается запустить его в вашем JVM не имеет смысла совсем. Еще один важный момент Ява.ленг.Объект, не реализующий Сериализуемый интерфейс-это любой класс, который вы создаете, распространяется только Объект (и никакой другой сериализуемый classes) не сериализуется, если вы реализуете интерфейс самостоятельно (как и в предыдущем примере).

эта ситуация представляет собой проблему: что если у нас есть класс, который содержит экземпляр нити? В таком случае, можем ли мы когда-нибудь сохранить объекты этого тип? Ответ да, пока мы скажите механизму сериализации наше намерения, пометив наш класс Thread объект как преходящий.


вы можете проверить эффективную Java для некоторых gotchas в отношении сериализации. Это, как правило, но если данная функция является основной частью вашего приложения, вы захотите узнать о них заранее.

примеры включают Проблемы безопасности, наследование и, самое главное, возможность публично "заморозить" API с его реализацией (например, в разных версиях программного обеспечения). Опять же, все они продвинуты и не должны сдерживать вас как таковых.


java.Ио.Object [Input/Output]Stream-это два класса, которые вам нужно посмотреть.
любой класс, который вы хотите сохранить в файл, должен реализовать java.Ио.Сериализуемый интерфейс.


вы также можете рассмотреть возможность использования кодировки XML, которая, как мне кажется, имеет большую долговечность, чем сериализация. Использовать java.beans.XMLEncoder/XMLDecoder классы.


Я не использовал его, но код Google выпустила protobuf недавно.


Я согласен с mjlee, что буферы протокола от Google - лучший способ хранения объектов, чем исходный способ сериализации. Взгляните, и Вам понравится.


интересно, почему никто не упомянул JSON и, например, Jackson JSON сериализатор.