У меня есть класс простого объекта, например man, с двумя полями name и age. И мне нужно, чтоб при старте программы, считывался текстовый конфигурационный файл, в котором будут описаны экземпляры класса. Например
[vova]
age=12
[max]
age=10
и т.д. ну и дальше, я бы создал соответствующие экземпляры с этими параметрами.
Понятно, что я могу написать кастомный парсер файла...но может уже есть готовый инструмент типа properties ?
формат файла с настройками не принципиален, я привел пример на вскидку...
Судя по всему вы хотите сериализовывать и десериализовывать Java Beans. Есть стандартная реализация этого через XML файлы.
Предположим, что ваш Java Bean представляет из себя следующий класс:
package com.example;
public class Human {
private String name;
private int age;
public Human() {
// needs for serialization
}
public Human(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Human{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Переопределение toString() тут необязательно. Я его сделал лишь для того, чтобы иметь возможность распечатывать объекты в демонстрационном коде. А вот и сам демонстрационный код, показывающий процесс сериализации и десериализации экземпляров класса Human:
public static void main(String[] args) {
Human bob = new Human("Bob", 34);
Human mary = new Human("Mary", 27);
try (XMLEncoder encoder = new XMLEncoder(new FileOutputStream("humans.xml"))) {
encoder.writeObject(bob);
encoder.writeObject(mary);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try (XMLDecoder decoder = new XMLDecoder(new FileInputStream("humans.xml"))) {
Human human1 = (Human) decoder.readObject();
Human human2 = (Human) decoder.readObject();
System.out.println(human1);
System.out.println(human2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Программа распечатает:
Human{name='Bob', age=34}
Human{name='Mary', age=27}
Тоесть в переменных human1 и human2 будут находиться объекты, эквивалентные тем, что находятся в переменных bob и mary соответственно.
Для рабочего кода желательно так же переопределить equals() и hashCode() в классе Human.
Содержимое файла humans.xml, в моём случае, получилось таким:
<?xml version="1.0" encoding="UTF-8"?>
<java version="10.0.2" class="java.beans.XMLDecoder">
<object class="com.example.Human">
<void property="age">
<int>34</int>
</void>
<void property="name">
<string>Bob</string>
</void>
</object>
<object class="com.example.Human">
<void property="age">
<int>27</int>
</void>
<void property="name">
<string>Mary</string>
</void>
</object>
</java>
Сборка персонального компьютера от Artline: умный выбор для современных пользователей