Каков самый простой способ parsingа INI-файла на Java?

Я пишу замену для старого приложения на Java. Одним из требований является то, что файлы ini, которые использовалось старым приложением, должны быть прочитаны как есть в новом Java-приложении. Формат этих ini-файлов – это общий стиль Windows с секциями заголовка и парами ключ = значение, используя # в качестве символа для комментариев.

Я попытался использовать class Properties из Java, но, конечно, это не сработает, если между разными заголовками есть столкновение имен.

Итак, вопрос в том, что было бы самым простым способом прочитать в этом INI-файле и получить доступ к ключам?

Библиотека, которую я использовал, – ini4j . Он легкий и легко анализирует файлы ini. Также он не использует эзотерических зависимостей для 10 000 других файлов jar, поскольку одной из целей дизайна было использование только стандартного Java API

Это пример использования библиотеки:

Ini ini = new Ini(new File(filename)); java.util.prefs.Preferences prefs = new IniPreferences(ini); System.out.println("grumpy/homePage: " + prefs.node("grumpy").get("homePage", null)); 

Как уже упоминалось , ini4j можно использовать для достижения этого. Позвольте мне показать еще один пример.

Если у нас есть файл INI:

 [header] key = value 

Следующее должно отображать value для STDOUT:

 Ini ini = new Ini(new File("/path/to/file")); System.out.println(ini.get("header", "key")); 

Дополнительные сведения см. В руководствах .

Проще всего 80 строк:

 package windows.prefs; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class IniFile { private Pattern _section = Pattern.compile( "\\s*\\[([^]]*)\\]\\s*" ); private Pattern _keyValue = Pattern.compile( "\\s*([^=]*)=(.*)" ); private Map< String, Map< String, String >> _entries = new HashMap<>(); public IniFile( String path ) throws IOException { load( path ); } public void load( String path ) throws IOException { try( BufferedReader br = new BufferedReader( new FileReader( path ))) { String line; String section = null; while(( line = br.readLine()) != null ) { Matcher m = _section.matcher( line ); if( m.matches()) { section = m.group( 1 ).trim(); } else if( section != null ) { m = _keyValue.matcher( line ); if( m.matches()) { String key = m.group( 1 ).trim(); String value = m.group( 2 ).trim(); Map< String, String > kv = _entries.get( section ); if( kv == null ) { _entries.put( section, kv = new HashMap<>()); } kv.put( key, value ); } } } } } public String getString( String section, String key, String defaultvalue ) { Map< String, String > kv = _entries.get( section ); if( kv == null ) { return defaultvalue; } return kv.get( key ); } public int getInt( String section, String key, int defaultvalue ) { Map< String, String > kv = _entries.get( section ); if( kv == null ) { return defaultvalue; } return Integer.parseInt( kv.get( key )); } public float getFloat( String section, String key, float defaultvalue ) { Map< String, String > kv = _entries.get( section ); if( kv == null ) { return defaultvalue; } return Float.parseFloat( kv.get( key )); } public double getDouble( String section, String key, double defaultvalue ) { Map< String, String > kv = _entries.get( section ); if( kv == null ) { return defaultvalue; } return Double.parseDouble( kv.get( key )); } } 

Вот простой, но мощный пример, используя class apache HierarchicalINIConfiguration :

 HierarchicalINIConfiguration iniConfObj = new HierarchicalINIConfiguration(iniFile); // Get Section names in ini file Set setOfSections = iniConfObj.getSections(); Iterator sectionNames = setOfSections.iterator(); while(sectionNames.hasNext()){ String sectionName = sectionNames.next().toString(); SubnodeConfiguration sObj = iniObj.getSection(sectionName); Iterator it1 = sObj.getKeys(); while (it1.hasNext()) { // Get element Object key = it1.next(); System.out.print("Key " + key.toString() + " Value " + sObj.getString(key.toString()) + "\n"); } в HierarchicalINIConfiguration iniConfObj = new HierarchicalINIConfiguration(iniFile); // Get Section names in ini file Set setOfSections = iniConfObj.getSections(); Iterator sectionNames = setOfSections.iterator(); while(sectionNames.hasNext()){ String sectionName = sectionNames.next().toString(); SubnodeConfiguration sObj = iniObj.getSection(sectionName); Iterator it1 = sObj.getKeys(); while (it1.hasNext()) { // Get element Object key = it1.next(); System.out.print("Key " + key.toString() + " Value " + sObj.getString(key.toString()) + "\n"); } 

Конфигурация Commons имеет несколько зависимостей времени выполнения . Как минимум, требуются коммонансы и commons-logging . В зависимости от того, что вы делаете с ним, вам могут потребоваться дополнительные библиотеки (подробности см. В предыдущей ссылке).

Или со стандартным API Java вы можете использовать java.util.Properties :

 Properties props = new Properties(); try (FileInputStream in = new FileInputStream(path)) { props.load(in); } 

В 19 строках, расширяя java.util.Properties для анализа на несколько разделов:

 public static Map parseINI(Reader reader) throws IOException { Map result = new HashMap(); new Properties() { private Properties section; @Override public Object put(Object key, Object value) { String header = (((String) key) + " " + value).trim(); if (header.startsWith("[") && header.endsWith("]")) result.put(header.substring(1, header.length() - 1), section = new Properties()); else section.put(key, value); return null; } }.load(reader); return result; } 

Другой вариант – Apache Commons Config также имеет class для загрузки из файлов INI . Он имеет некоторые зависимости от времени выполнения , но для файлов INI он должен требовать только коллекций Commons, lang и logging.

Я использовал Commons Config для проектов с их свойствами и конфигурациями XML. Он очень прост в использовании и поддерживает некоторые довольно мощные функции.

Вы можете попробовать JINIFile. Является переводом TIniFile из Delphi, но для java

https://github.com/SubZane/JIniFile

Я лично предпочитаю Конфуцию .

Приятно, поскольку он не требует каких-либо внешних зависимостей, он крошечный – всего 16 КБ и автоматически загружает ваш ini-файл при инициализации. Например

 Configurable config = Configuration.getInstance(); String host = config.getStringValue("host"); int port = config.getIntValue("port"); new Connection(host, port); 
  • Разбирайте строку так, как если бы она была запросом в Ruby on Rails
  • Как разбирать данные JSON с помощью jQuery / JavaScript?
  • Есть ли альтернатива для гибких / бизонов, которые можно использовать в 8-битных встроенных системах?
  • Пользовательский десериализатор JSON с использованием Gson
  • Почему DateTime.Parse не обрабатывает дату UTC
  • ISO 8601 Объект String to Date / Time в Android
  • Получить информацию ffmpeg по-дружески
  • привязки, не разрешающие обработку АСТ в eclipse
  • Более безопасная, но простая в использовании и гибкая альтернатива C ++ для s ++ ()
  • Как разбирать строку запроса в NameValueCollection в .NET.
  • Секундомер как разделитель запросов URL
  • Давайте будем гением компьютера.