ini4j - Как получить все имена ключей в настройке?

Я решил использовать ini-файл для хранения простой конфигурации пары ключ-значение для моего Java-приложения.

Я гуглил и искал stackru и обнаружил, что ini4j настоятельно рекомендуется для анализа и интерпретации ini-файлов в Java. Я потратил некоторое время на чтение учебника на сайте ini4j; Однако я не был уверен, как получить все значения ключа для параметра в INI-файле.

Например, если у меня есть файл INI, как это:

[ food ]
name=steak
type=american
price=20.00

[ school ]
dept=cse
year=2
major=computer_science

и предположим, что я не знаю названия ключей раньше времени. Как получить список ключей, чтобы в конечном итоге получить значения в соответствии с ключами? Например, я бы получил массив или какую-то структуру данных, содержащую "имя", "тип" и "цену", если бы я получил список ключей для еды.

Может кто-нибудь показать мне пример, в котором вы бы открыли INI-файл, проанализировали или интерпретировали его так, чтобы приложение знало всю структуру и значения INI-файла, и получили список ключей и значений?

3 ответа

Решение

Никаких гарантий на этот счет. Сделано это в 5 минут. Но он читает предоставленный вами ini без дальнейшего знания самого ini (помимо знания, что он состоит из нескольких разделов, каждый из которых имеет несколько опций.

Думаю, тебе придется самому разобраться.

import org.ini4j.Ini;
import org.ini4j.Profile.Section;
import java.io.FileReader;

public class Test {
    public static void main(String[] args) throws Exception {
        Ini ini = new Ini(new FileReader("test.ini"));
        System.out.println("Number of sections: "+ini.size()+"\n");
        for (String sectionName: ini.keySet()) {
            System.out.println("["+sectionName+"]");
            Section section = ini.get(sectionName);
            for (String optionKey: section.keySet()) {
                System.out.println("\t"+optionKey+"="+section.get(optionKey));
            }
        }
    }
}

Ознакомьтесь с примерами ini4j и учебниками ini4j. Как часто не очень хорошо документированная библиотека.

Я ничего не мог найти в уроках, поэтому я прошелся по источнику, пока не нашел entrySet метод. С этим вы можете сделать это:

Wini ini = new Wini(new File(...));
Set<Entry<String, Section>> sections = ini.entrySet(); /* !!! */

for (Entry<String, Section> e : sections) {
    Section section = e.getValue();
    System.out.println("[" + section.getName() + "]");

    Set<Entry<String, String>> values = section.entrySet(); /* !!! */
    for (Entry<String, String> e2 : values) {
        System.out.println(e2.getKey() + " = " + e2.getValue());
    }
}

Этот код по сути перепечатывает INI-файл на консоль. Ваш пример файла будет производить этот вывод: (порядок может отличаться)

[food]
name = steak
type = american
price = 20.00
[school]
dept = cse
year = 2
major = computer_science

Интересующие методы: get() и keySet()

Wini myIni = new Wini (new File ("test.ini"));

// list section names
for (String sName : myIni.keySet()) {
    System.out.println(sName);
}

// check for a section, section name is case sensitive
boolean haveFoodParameters = myIni.keySet().contains("food");

// list name value pairs within a specific section
for (String name : myIni.get("food").keySet() {
    System.out.println (name + " = " + myIni.get("food", name)
}

В Котлине:

        val ini = Wini(File(iniPath))
        Timber.e("Read value:${ini}")
        println("Number of sections: "+ini.size+"\n");
        for (sectionName in ini.keys) {
            println("[$sectionName]")
            val section: Profile.Section? = ini[sectionName]
            if (section != null) {
                for (optionKey in section.keys) {
                    println("\t" + optionKey + "=" + section[optionKey])
                }
            }
        }
Другие вопросы по тегам