Я пишу замену устаревшему приложению на Java. Одно из требований состоит в том, что файлы ini, которые использовало старое приложение, должны читаться как есть в новом приложении Java. Формат этих файлов ini является обычным стилем Windows, с разделами заголовка и парами ключ = значение, используя # в качестве символа для комментариев.
Я пробовал использовать класс Properties из Java, но, конечно, это не сработает, если между разными заголовками есть конфликты имен.
Итак, вопрос в том, как проще всего прочитать этот INI-файл и получить доступ к ключам?
IniFile
урок был исключен, попробуйтеIni ini = new Ini(new File("/path/to/file"));
Wini
класс, как показано в учебнике «Одна минута»;prefs.node("something").get("val", null)
не работает так , как я ожидал.Как уже упоминалось , для этого можно использовать ini4j . Приведу еще один пример.
Если у нас есть такой INI-файл:
В
value
STDOUT должно отображаться следующее :Проверьте учебники для большего количества примеров.
источник
Всего 80 строк:
источник
Вот простой, но мощный пример использования класса apache HierarchicalINIConfiguration :
Конфигурация Commons имеет ряд зависимостей во время выполнения . Как минимум, требуются commons-lang и commons-logging . В зависимости от того, что вы с ним делаете, вам могут потребоваться дополнительные библиотеки (подробности см. В предыдущей ссылке).
источник
Или со стандартным API Java вы можете использовать java.util.Properties :
источник
Properties
класс неправильно получает значения, содержащие \native2ascii
В 18 строках расширение
java.util.Properties
для разбора на несколько разделов:источник
Другой вариант - Apache Commons Config также имеет класс для загрузки из файлов INI . У него есть некоторые зависимости во время выполнения , но для файлов INI он должен требовать только коллекции Commons, язык и ведение журнала.
Я использовал Commons Config для проектов с их свойствами и конфигурациями XML. Он очень прост в использовании и поддерживает несколько довольно мощных функций.
источник
Вы можете попробовать JINIFile. Это перевод TIniFile из Delphi, но для java
https://github.com/SubZane/JIniFile
источник
Лично я предпочитаю Confucious .
Это приятно, поскольку не требует никаких внешних зависимостей, он крошечный - всего 16 КБ и автоматически загружает ваш ini-файл при инициализации. Например
источник
Решение hoat4 очень элегантно и просто. Он работает для всех нормальных ini-файлов. Однако я встречал многих, у которых в ключе присутствовали неэкранированные пробелы .
Чтобы решить эту проблему, я загрузил и изменил копию
java.util.Properties
. Хотя это немного неортодоксально и краткосрочно, на самом деле модификации состояли из нескольких строк и были довольно простыми. Я внесу предложение сообществу JDK о внесении изменений.Добавив внутреннюю переменную класса:
Я контролирую обработку, связанную со сканированием точки разделения ключ / значение. Я заменил код поиска пробелов небольшим частным методом, который возвращает логическое значение в зависимости от состояния указанной выше переменной.
Этот метод используется в двух местах частного метода
load0(...)
.Существует также общедоступный метод для его включения, но было бы лучше использовать исходную версию,
Properties
если разделитель пробелов не является проблемой для вашего приложения.Если есть интерес, я готов выложить код в свой
IniFile.java
файл. Он работает с любой версиейProperties
.источник
Используя ответ @Aerospace, я понял, что для файлов INI законно иметь разделы без каких-либо ключей и значений. В этом случае добавление к карте верхнего уровня должно произойти до того, как будут найдены какие-либо пары "ключ-значение", например (минимально обновлено для Java 8):
источник
Это так просто ...
источник