11

我决定使用 ini 文件来为我的 Java 应用程序存储简单的键值对配置。

我用 Google 搜索并搜索了 stackoverflow,发现强烈建议使用 ini4j 来解析和解释 Java 中的 ini 文件。我花了一些时间阅读 ini4j 网站上的教程;但是,我不确定如何获取 ini 文件中设置的所有键值。

例如,如果我有一个这样的 ini 文件:

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

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

并假设我事先不知道键的名称。如何获取键列表,以便最终可以根据键检索值?例如,如果我得到食物的键列表,我会得到一个数组或某种包含“名称”、“类型”和“价格”的数据结构。

有人可以给我一个例子,你可以打开一个 ini 文件,解析或解释它,以便应用程序知道 ini 文件的所有结构和值,并获取键和值列表?

4

4 回答 4

14

对此没有任何保证。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 教程。通常是一个没有很好记录的库。

于 2009-10-21T18:48:01.997 回答
4

我在教程中找不到任何东西,所以我逐步浏览了源代码,直到找到了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
于 2011-04-28T09:01:02.680 回答
0

感兴趣的方法是 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)
}
于 2014-06-27T16:23:44.003 回答
0

在科特林:

        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])
                }
            }
        }
于 2020-10-15T13:49:18.423 回答