Piszę zastępstwo dla starszej aplikacji w Javie. Jednym z wymagań jest to, że pliki ini używane przez starszą aplikację muszą być wczytywane w nowej aplikacji Java. Format tych plików ini to typowy styl systemu Windows, z sekcjami nagłówka i parami klucz = wartość, przy użyciu znaku # jako znaku komentarza.
Próbowałem użyć klasy Właściwości z języka Java, ale oczywiście to nie zadziała, jeśli występują konflikty nazw między różnymi nagłówkami.
Pytanie brzmi, jaki byłby najłatwiejszy sposób odczytania tego pliku INI i uzyskania dostępu do kluczy?
IniFile
zajęcia zostały wyjęte, spróbujIni ini = new Ini(new File("/path/to/file"));
Wini
klasy, jak pokazano w samouczku „Jedna minuta”;prefs.node("something").get("val", null)
nie działa tak, jak oczekiwano.Jak wspomniano , można to osiągnąć za pomocą ini4j . Pokażę inny przykład.
Jeśli mamy taki plik INI:
W
value
STDOUT powinien zostać wyświetlony następujący komunikat :Sprawdź tutoriale więcej przykładów.
źródło
Tak proste, jak 80 linii:
źródło
Oto prosty, ale potężny przykład, wykorzystujący HierarchicalINIConfiguration klasy Apache :
Commons Configuration ma wiele zależności w czasie wykonywania . Jako minimum wymagane są rejestracje typu common-lang i commons-logs . W zależności od tego, co z nim robisz, możesz potrzebować dodatkowych bibliotek (zobacz poprzednie łącze, aby uzyskać szczegółowe informacje).
źródło
Lub ze standardowym interfejsem API Java możesz użyć java.util.Properties :
źródło
Properties
klasa nie pobiera poprawnie wartości zawierających \native2ascii
W 18 wierszach, rozszerzając
java.util.Properties
to parse na wiele sekcji:źródło
Inną opcją jest to, że Apache Commons Config ma również klasę do ładowania z plików INI . Ma pewne zależności w czasie wykonywania , ale w przypadku plików INI powinien wymagać tylko kolekcji Commons, lang i rejestrowania.
Użyłem Commons Config w projektach z ich właściwościami i konfiguracjami XML. Jest bardzo łatwy w użyciu i obsługuje kilka całkiem potężnych funkcji.
źródło
Możesz spróbować JINIFile. Jest tłumaczeniem pliku TIniFile z Delphi, ale dla java
https://github.com/SubZane/JIniFile
źródło
Osobiście wolę Confucious .
Jest fajny, ponieważ nie wymaga żadnych zewnętrznych zależności, jest mały - tylko 16K i automatycznie ładuje twój plik ini podczas inicjalizacji. Na przykład
źródło
Rozwiązanie hoat4 jest bardzo eleganckie i proste. Działa dla wszystkich rozsądnych plików ini. Jednak widziałem wiele, które mają niezatarte znaki spacji w kluczu .
Aby rozwiązać ten problem, pobrałem i zmodyfikowałem kopię pliku
java.util.Properties
. Chociaż jest to trochę niekonwencjonalne i krótkoterminowe, rzeczywiste mody miały tylko kilka linijek i były dość proste. Przedstawię społeczności JDK propozycję wprowadzenia zmian.Dodając wewnętrzną zmienną klasy:
Kontroluję przetwarzanie związane ze skanowaniem w poszukiwaniu punktu separacji klucz / wartość. Zastąpiłem kod wyszukiwania znaków spacji małą metodą prywatną, która zwraca wartość logiczną w zależności od stanu powyższej zmiennej.
Ta metoda jest używana w dwóch miejscach w ramach metody prywatnej
load0(...)
.Istnieje również publiczna metoda włączania go, ale lepiej byłoby użyć oryginalnej wersji,
Properties
jeśli separator spacji nie stanowi problemu dla twojej aplikacji.Jeśli jest zainteresowanie, chętnie prześlę kod do mojego
IniFile.java
pliku. Działa z każdą wersjąProperties
.źródło
Korzystając z odpowiedzi @Aerospace, zdałem sobie sprawę, że pliki INI mogą mieć sekcje bez żadnych par klucz-wartość. W takim przypadku dodanie do mapy najwyższego poziomu powinno nastąpić przed znalezieniem jakichkolwiek par klucz-wartość, np. (Minimalna aktualizacja dla Java 8):
źródło
To jest tak proste, jak to .....
źródło