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])
}
}
}