Java: сохранить объекты в текстовом файле? Есть ли готовые решения?
Я хочу сохранить объекты, которые я создал в программе. После перезагрузки приложение должно автоматически загружать все объекты в массив. Я хочу записать их в файл и проанализировать их после перезагрузки. Есть ли другие возможности умнее, чем сделать это вручную? Спасибо
8 ответов
можно использовать Berkeley DB PersistentMap
класс для сохранения вашего (Serializable
) объекты в Map
реализация (кэш), которая сохраняет их в файле. Он довольно прост в использовании и означает, что вам не нужно беспокоиться о том, что сохранить где.
три вещи, чтобы отметить о сериализации:
- как вы собираетесь справляться с изменениями схемы (т. е. изменять данные, из которых состоят ваши классы - например, добавление нового поля)
- что произойдет, если ваш файл(ы) поврежден? В зависимости от того, насколько надежным должно быть хранилище вашей программы, это повлияет на ваше решение о сохранении данных, неявно содержащихся в объектах. Помните, что вы всегда можете использовать реляционную базу данных, такую как в MySQL и затем преобразовать эти данные в объекты
- вам нужно иметь возможность просматривать или запрашивать данные за пределами программы? Что делать, если вы хотите ответить на простой вопрос: "сколько объект имеет свойство 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
классы.
Я согласен с mjlee, что буферы протокола от Google - лучший способ хранения объектов, чем исходный способ сериализации. Взгляните, и Вам понравится.
интересно, почему никто не упомянул JSON и, например, Jackson JSON сериализатор.