Pytanie Najlepszy sposób na zachowanie pliku konfiguracyjnego dla aplikacji java [zamknięty]


Piszę aplikację java, która zawiera wiele ustawień, które można zapisać. Zasadniczo moja struktura konfiguracji wygląda następująco:

Config
| _ gra 1
   | _ Nazwa gry: bla ...
   | _ Nazwa gracza: alicja
   | _ Nazwa gracza: Bob
   | _ inne ustawienia ...
| _ gra 2
   | _ Nazwa gry: hah
   | _ Nazwa gracza: alicja
   | _ Nazwa gracza: Bob
   | _ inne ustawienia ...
| _ gra n ....

Masz pomysł. Próbowałem używać xml, ale praca z dom4j jest trudna, zwłaszcza że istnieje wiele węzłów potomnych o tej samej nazwie w różnych i tych samych węzłach nadrzędnych i muszę je bardzo często zmieniać. Jak dotąd najbardziej bezproblemowy sposób, jaki odkrywam, to użycie zwykłego pliku tekstowego, takiego jak

[Gra 1]
Nazwa gry: bla
Nazwa gracza: alicja
Nazwa gracza: Bob
...

[Gra 2]
...

Ale mam wrażenie, że to bardzo elementarne. Więc jaka jest najlepsza lub standardowa praktyka w branży do utrzymywania plików konfiguracyjnych w java?

EDYTOWAĆ : Chciałbym, żeby to rozwiązanie było przenośne, na przykład kopiowanie pliku z jednego komputera na drugi nie złamie programu. (Przykro mi, zapomnij o tym wcześniej.)


11
2017-07-11 12:04


pochodzenie




Odpowiedzi:


Najlepszym sposobem na zapisanie ustawień / preferencji w java jest użycie Preferencje API.


5
2017-07-11 12:12





Powinieneś użyć automatycznego programu ładującego do napisania pliku XML. Kilka lat temu użyłem CastorXML ale dzisiaj istnieją prawdopodobnie bardziej nowoczesne interfejsy API do tego celu.

Za pomocą tego interfejsu API zasadniczo:

  • Przechowuj całą konfigurację w prostym POJO
  • Wywołaj Marshallera
  • Zadzwoń do marshaller.write (MyConfig)

Gdy chcesz wczytać konfigurację:

  • Wywołaj unmarshallera
  • zadzwoń do Marshaller.read (yourFile)

Możesz opisać mapowanie XML w pliku konfiguracyjnym lub użyć domyślnego programu Marshaller (1 atrybut ~ 1 znacznik XML)

To takie proste.

EDYTOWAĆ:

Po przeszukaniu w ten wątek, Specyfikacja JAXB pojawiła się po pierwszej odsłonie CastorXML, a implementacja JAXB firmy Sun wydaje się być standardem dla Java <-> XML mapowanie.


2
2017-07-11 12:08



W tym przypadku chodzi o to, że mam wiele atrybutów o tej samej nazwie, takich jak player name. Więc kiedy chcę się zmienić Alice do Leo, Chcę się upewnić, że nie zostanie on nadpisany Bob tutaj. Czy CastorXML może to zagwarantować? Dzięki. - YankeeWhiskey


Rozważ użycie YAML aby zdefiniować konfigurację, jest znacznie mniej gadatliwy w porównaniu do XML, na przykład:

games:
  - name: 'game 1'
    players: ['Bob', 'Alice']
    ...
  - name: 'game 2'
    players: ['Bob', 'Alice']
    ...

Następnie możesz użyć Jackson biblioteka z Rozszerzenie YAML do interakcji z konfiguracją, na przykład w celu przeanalizowania konfiguracji:

File configFile = new File("...");
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Configuration config = mapper.readValue(configFile, Configuration.class);

1
2017-07-11 13:22





Sprawdzić Konfiguracja Apache Commons.

Zapewnia dobre wsparcie dla konfiguracje hierarchiczne.

XMLConfiguration config = new XMLConfiguration("games.xml");
String gameName = config.getString("game1.name");
List<Object> playerNames = config.getList("game1.players.player.name");
// ...
config.setProperty("game1.name", "Space Invaders"); // update game name
config.addProperty("game1.players.player(-1).name", "ted"); // add new players
config.addProperty("game1.players.player(-1).name", "carol"); 
config.clearTree("game1.players.player(1)"); // remove a player

// Or with XPath 
config.setExpressionEngine(new XPathExpressionEngine());
config.addProperty("game1/players player/name", "ted"); 
config.addProperty("game1/players player/name", "carol"); 
config.clearTree("game1/players/player[2]");

1
2017-07-11 12:23