Ich schreibe einen Drop-In-Ersatz für eine Legacy-Anwendung in Java. Eine der Anforderungen ist, dass die INI-Dateien, die die ältere Anwendung verwendet, unverändert in die neue Java-Anwendung eingelesen werden müssen. Das Format dieser INI-Dateien ist der übliche Windows-Stil mit Kopfzeilenabschnitten und Schlüssel-Wert-Paaren, wobei # als Zeichen für das Kommentieren verwendet wird.
Ich habe versucht, die Properties-Klasse aus Java zu verwenden, aber das funktioniert natürlich nicht, wenn zwischen verschiedenen Headern Namenskonflikte auftreten.
Die Frage ist also, wie Sie diese INI-Datei am einfachsten einlesen und auf die Schlüssel zugreifen können.
IniFile
Klasse herausgenommen wurde, versuchen SieIni ini = new Ini(new File("/path/to/file"));
Wini
Klasse verwenden, wie im "One Minute" -Tutorial dargestellt. Dasprefs.node("something").get("val", null)
hat nicht so funktioniert, wie ich es erwartet hatte.Wie bereits erwähnt , kann ini4j verwendet werden, um dies zu erreichen. Lassen Sie mich ein weiteres Beispiel zeigen.
Wenn wir eine INI-Datei wie diese haben:
Für
value
STDOUT sollte Folgendes angezeigt werden:Weitere Beispiele finden Sie in den Tutorials .
quelle
So einfach wie 80 Zeilen:
quelle
Hier ist ein einfaches, aber leistungsstarkes Beispiel mit der Apache-Klasse HierarchicalINIConfiguration :
Die Commons-Konfiguration weist eine Reihe von Laufzeitabhängigkeiten auf . Zumindest sind commons-lang und commons-logging erforderlich. Je nachdem, was Sie damit machen, benötigen Sie möglicherweise zusätzliche Bibliotheken (Details siehe vorherigen Link).
quelle
Oder mit der Standard-Java-API können Sie java.util.Properties verwenden :
quelle
Properties
erhält die Klasse nicht richtig Werte, die \native2ascii
In 18 Zeilen wird das
java.util.Properties
Parsen in mehrere Abschnitte erweitert:quelle
Eine weitere Option ist, dass Apache Commons Config auch eine Klasse zum Laden aus INI-Dateien hat . Es gibt einige Laufzeitabhängigkeiten , aber für INI-Dateien sollten nur Commons-Sammlungen, lang und Protokollierung erforderlich sein.
Ich habe Commons Config für Projekte mit ihren Eigenschaften und XML-Konfigurationen verwendet. Es ist sehr einfach zu bedienen und unterstützt einige ziemlich mächtige Funktionen.
quelle
Sie könnten JINIFile versuchen. Ist eine Übersetzung des TIniFile aus Delphi, aber für Java
https://github.com/SubZane/JIniFile
quelle
Ich persönlich bevorzuge Konfuzious .
Es ist schön, da es keine externen Abhängigkeiten erfordert, es ist winzig - nur 16 KB, und lädt Ihre INI-Datei bei der Initialisierung automatisch. Z.B
quelle
Die Lösung von hoat4 ist sehr elegant und einfach. Es funktioniert für alle vernünftigen INI-Dateien. Ich habe jedoch viele gesehen, die nicht maskierte Leerzeichen im Schlüssel haben .
Um dies zu lösen, habe ich eine Kopie von heruntergeladen und geändert
java.util.Properties
. Obwohl dies ein wenig unorthodox und kurzfristig ist, waren die eigentlichen Mods nur ein paar Zeilen und recht einfach. Ich werde der JDK-Community einen Vorschlag unterbreiten, um die Änderungen aufzunehmen.Durch Hinzufügen einer internen Klassenvariablen:
Ich steuere die Verarbeitung im Zusammenhang mit dem Scannen nach dem Schlüssel / Wert-Trennungspunkt. Ich habe den Suchcode für Leerzeichen durch eine kleine private Methode ersetzt, die abhängig vom Status der obigen Variablen einen Booleschen Wert zurückgibt.
Diese Methode wird an zwei Stellen innerhalb der privaten Methode verwendet
load0(...)
.Es gibt auch eine öffentliche Methode zum Einschalten. Es ist jedoch besser, die Originalversion von zu verwenden,
Properties
wenn das Leerzeichen für Ihre Anwendung kein Problem darstellt.Bei Interesse bin ich bereit, den Code in meine
IniFile.java
Datei aufzunehmen. Es funktioniert mit beiden Versionen vonProperties
.quelle
Durch die Antwort von @Aerospace wurde mir klar, dass es für INI-Dateien legitim ist, Abschnitte ohne Schlüsselwerte zu haben. In diesem Fall sollte das Hinzufügen zur Top-Level-Map erfolgen, bevor Schlüsselwerte gefunden werden, z. B. (für Java 8 minimal aktualisiert):
quelle
So einfach ist das .....
quelle