Сохранение данных из JavaFX-приложения без базы данных
К сожалению, я не смог найти ничего конкретного по этой теме / по моей проблеме. Вот так:
Я создаю бизнес-приложение JavaFX для моего друга. К сожалению, у меня нет возможности подключиться к базе данных. Я хочу, чтобы приложение загрузило сохранение из файла. Приложение содержит список с клиентами, и клиенты получили некоторые специфические свойства. Я не хочу жестко закодировать это в файл.prop или.txt, потому что я уверен, что есть другой способ сделать это, не так ли?
Заранее спасибо, ценю это!
2 ответа
Много вариантов для сохранения данных в локальном хранилище. Точный выбор зависит от ваших потребностей. Вы не описали достаточно деталей, чтобы дать конкретную рекомендацию.
Вот список возможностей, примерно в порядке возрастания сложности ваших данных.
Текстовый файл
Если у вас есть небольшие объемы простых данных, сохраните их в текстовый файл. Вы можете хранить каждый кусок в отдельном файле или объединить в один файл. Последние версии Java имеют новые классы, чтобы сделать это проще, чем когда-либо. Смотрите Oracle Tutorial.
Разделенный запятыми и разделенный табуляцией
Для наборов структурированных данных пишите в текстовые файлы с разделенными запятыми значениями (CSV) или значениями, разделенными табуляцией. Например, список людей со строками для каждого человека и столбцами для имени, номера телефона и адреса электронной почты.
Хотя чтение / запись таких файлов достаточно просто для программирования, я предлагаю использовать установленную библиотеку, чтобы устранить трудоемкость, избежать ошибок и сэкономить некоторое время. Есть несколько таких библиотек, написанных на Java.
Мой фаворит - проект Apache Commons CSV. Эта библиотека облегчает работу по чтению / записи таких файлов. Несмотря на название, эта библиотека поддерживает разделенные табуляцией, а также форматы, разделенные запятыми. Я написал несколько Ответов здесь, в Переполнении стека, показывающих, как использовать эту библиотеку, как вы можете видеть здесь, здесь и здесь.
Кстати, обычный старый ASCII явно определяет несколько позиций символов для разграничения в файлах данных с четырьмя уровнями группировки (документ, группа, запись / строка и поле). Unicode, конечно, наследует их от ASCII как кодовые точки. Я озадачен, почему они так неясны и так редко используются. Мне кажется, это гораздо более логично, чем использование запятых и вкладок, которые вполне могут существовать внутри полезных данных.
Сериализация
Вы можете записать значения данных, хранящиеся в объекте. Это называется сериализацией. Java имеет встроенную возможность сериализации, но не забудьте изучить детали.
Чтобы проще было записать значения объекта, а затем прочитать их обратно, чтобы воссоздать объект, мне очень понравилось использовать проект Simple XML Serialization. Это хорошо работает для относительно простых потребностей и нацелено на ситуацию, когда вы хотите, чтобы структура класса управляла процессом определения того, что писать.
У Java есть другие средства связывания XML, как встроенные, так и сторонние. Они гораздо мощнее в своей гибкости. Они особенно хороши для случаев, когда вы хотите жестко определить и проверить структуру XML, например, определить DTD XML или схему XML, с помощью которых можно проверять данные и, возможно, даже генерировать класс Java, в котором они будут представлены.
Встроенная база данных
Для более сложных данных используйте встроенную реляционную базу данных.
База данных SQLite поставляется со многими платформами. Это библиотека на основе C, а не чистая Java. Как видно из названия, SQLite действительно довольно "облегченный", ему не хватает жестких типов данных и многих других общих функций базы данных. SQLite является альтернативой написанию текстовых файлов, а не конкурентом более серьезным базам данных. Это отличный продукт, если ваши потребности соответствуют его возможностям.
Мой первый выбор для встроенной базы данных будет H2 Database Engine. Построен на чистой Java. Может быть запущен внутри вашего приложения или отдельно как сервер (на ваш выбор). Имеет сложные функции реляционной базы данных. Был вокруг в течение многих лет, часто обновляется, и является изношенным. Основной автор имеет большой опыт в этой области.
Если вам нужно решение, которое не требует внешних библиотек, таких как SQLite, вы можете использовать ObjectOutputStream/ObjectInputStream.
Этот метод позволяет использовать класс Java, который сохраняет в файл в качестве хранилища данных.
ObjectDB.java
public class ObjectDB implements Serializable {
private static final long serialVersionUID = 5864896800675704551L;
private List<String> list;
private Map<String, String> map;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
ObjectTest.java
public class ObjectTest {
public static void main(String[] args) {
String FILENAME = "ObjectDB";
List<String> list = new ArrayList<>();
list.add("Bob");
list.add("Rick");
Map<String, String> map = new HashMap<String, String>();
map.put("Jane", "Rick");
map.put("Mike", "Bob");
ObjectDB db = new ObjectDB();
db.setList(list);
db.setMap(map);
try {
// Save Object
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILENAME))) {
oos.writeObject(db);
}
db = null;
// Read Object
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILENAME))) {
db = (ObjectDB) ois.readObject();
}
System.out.println(db.getList());
} catch (Exception e) {
e.printStackTrace();
}
}
}