Какой самый простой способ проанализировать файл INI в Java?
Я пишу замену для устаревшего приложения на Java. Одно из требований заключается в том, что ini-файлы, используемые старым приложением, должны быть прочитаны как есть в новом приложении Java. Формат этих ini-файлов является общим стилем windows, с разделами заголовка и парами ключ=значение, используя # в качестве символа для комментариев.
Я попытался использовать класс свойств из Java, но, конечно, это не сработает, если есть столкновения имен между разными заголовки.
Итак, вопрос в том, что было бы самым простым способом прочитать в этом INI-файле и получить доступ к ключам?
9 ответов:
библиотека, которую я использовал 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вывод: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 )); } }
вот простой, но мощный пример, используя класс 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"); }конфигурация Commons имеет число во время выполнения зависимостей. Как минимум, commons-lang и commons-logging есть. В зависимости от того, что вы делаете с ним, вам могут потребоваться дополнительные библиотеки (см. предыдущую ссылку для получения дополнительной информации).
или со стандартным Java API вы можете использовать java.утиль.Свойства:
Properties props = new Properties(); try (FileInputStream in = new FileInputStream(path)) { props.load(in); }
в 19 строках, расширяя
java.util.Propertiesдля разбора на несколько разделов:public static Map<String, Properties> parseINI(Reader reader) throws IOException { Map<String, Properties> 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 также есть класс для загрузки из INI файлы. У него есть некоторые во время выполнения зависимостей, но для INI-файлов он должен требовать только общие коллекции, lang и ведение журнала.
Я использовал Commons Config в проектах с их свойствами и конфигурациями XML. Он очень прост в использовании и поддерживает некоторые довольно мощные характеристики.
лично я предпочитаю Конфуций.
это приятно, так как он не требует каких - либо внешних зависимостей, он крошечный-всего 16K, и автоматически загружает ваш ini-файл при инициализации. Е. Г.
Configurable config = Configuration.getInstance(); String host = config.getStringValue("host"); int port = config.getIntValue("port"); new Connection(host, port);
Comments