Джава:Сохранить объекты в текстовый файл?Есть ли готовые решения?
Вопрос
Я хочу сохранить объекты, созданные мной в программе.После перезапуска приложение должно автоматически загружать все объекты в массиве.Я хочу записать их в файл и проанализировать после перезапуска.Есть ли другие более разумные возможности, чем сделать это вручную?Спасибо
Решение
Вы можете использовать Беркли ДБ PersistentMap
класс, чтобы сохранить ваш (Serializable
) объекты в Map
реализация (кэш), которая сохраняет их в файл.Он довольно прост в использовании и означает, что вам не придется беспокоиться о том, что и где сохранять.
Три вещи, которые следует отметить относительно сериализации:
- Как вы собираетесь справляться с изменениями схемы (т.изменение данных, из которых состоят ваши классы - например, добавление нового поля)
- Что произойдет, если ваши файлы будут повреждены?В зависимости от того, насколько надежным должно быть хранилище вашей программы, вы повлияете на ваше решение о том, как сохранять данные, которые неявно содержат ваши объекты.Помните, что вы всегда можете использовать реляционную базу данных, например MySQL а затем конвертируйте эти данные в свои объекты
- Нужна ли вам возможность просматривать или запрашивать данные? снаружи вашей программы?Что если вы хотите ответить на какой -то простой вопрос, например, «Сколько объектов имеет свойство X?» Легко сделать, если вы использовали (реляционную) базу данных;это не так просто, если вы сериализовали данные в файлы!
Другие советы
Да, концепция, которую вы ищете, называется сериализацией. У Sun есть отличное руководство здесь .
Идея состоит в том, что классы, которые вы хотите сохранить, должны реализовывать интерфейс Serializable. После этого вы используете java.io.ObjectOutputStream.writeObject () для записи объекта в файл и java.io.ObjectInputStream.readObject () для его считывания.
Вы не можете сериализовать все, поскольку есть вещи, которые не имеют смысла сериализировать, но вы можете обойти их. Вот цитата об этом:
Базовый механизм Java Сериализация проста в использовании, но Есть еще кое-что знать. Как упоминалось ранее, только объекты помечены Сериализуемый может быть сохранен. java.lang.Object класс не реализовать этот интерфейс. Следовательно, не все объекты в Java могут быть сохраняется автоматически. Хорошие новости является то, что большинство из них - как AWT и Swing GUI компоненты, строки и массивы - сериализуемы.
С другой стороны, определенные классы системного уровня, такие как Thread, OutputStream и его подклассы, и Сокет не сериализуем. В самом деле, это не имело бы никакого смысла, если бы они мы. Например, поток работает в моя JVM будет использовать мою систему объем памяти. Сохраняя это и пытаясь запускать его в своей JVM не имеет смысла совсем. Еще один важный момент о java.lang.Object не реализует Сериализуемый интерфейс - это то, что любой класс, который вы создаете, который распространяется только Объект (и никакой другой сериализуемый классы) не сериализуемы, если вы сами реализуете интерфейс (как и в предыдущем примере).
Эта ситуация представляет проблему: Что делать, если у нас есть класс, который содержит экземпляр Thread? В таком случае, можем ли мы когда-либо упорствовать объекты этого тип? Ответ да, пока мы расскажите механизм сериализации нашего намерения, отмечая наш класс Объект потока как временный.
Возможно, вы захотите проверить эффективную Java для некоторых ошибок в отношении сериализации. Они, как правило, продвинутые, но если эта функция является основной частью вашего приложения, вам нужно знать о них заранее. Р>
Примеры включают проблемы безопасности, наследование и, что наиболее важно, возможность публичного «замораживания» API с его реализацией (например, в разных версиях программного обеспечения). Опять же, все они продвинуты и не должны вас сдерживать.
java.io.Object [Input / Output] Stream - это два класса, на которые вы должны обратить внимание.
Любой класс, который вы хотите сохранить в файле, должен реализовывать интерфейс java.io.Serializable.
Возможно, вы захотите использовать XML-кодировку, которая, как мне кажется, более долговечна, чем сериализация. Используйте java.beans.XMLEncoder / XMLDecoder
классы.
Я не использовал его, но Google Code недавно выпустил protobuf .
Я согласен с mjlee, что буфер протокола из Google является лучший способ хранить объекты, чем оригинальный способ сериализации. Посмотрите, и вам понравится.
Интересно, почему никто не упомянул JSON и, например, Сериализатор JSON JSON .