Java - How to read/write for INI config file

當我們要讀取或寫入INI config file的時候,可以透過apache commons的HierarchicalINIConfiguration來處理,如此可以針對每個section來讀取key及value,還可以建立新的section
#引用到的Library如下:
commons-configuration-1.10.jar
apache-commons-lang.jar
org-apache-commons-logging.jar

#config.ini內容如下:
[account1]
name = Ben
age = 30

[account2]
name = Jacky
age = 24

#程式碼如下:
  1. import java.io.File;
  2. import java.util.Iterator;
  3. import org.apache.commons.configuration.ConfigurationException;
  4. import org.apache.commons.configuration.HierarchicalConfiguration;
  5. import org.apache.commons.configuration.HierarchicalINIConfiguration;
  6. import org.apache.commons.configuration.SubnodeConfiguration;
  7. import org.apache.commons.configuration.tree.ConfigurationNode;
  8. public class INIFileReadWrite {
  9. public static void main(String[] args) {
  10. // TODO Auto-generated method stub
  11. HierarchicalINIConfiguration iniconfig = new HierarchicalINIConfiguration();
  12. try {
  13. System.out.println("Case 1. Read from config.ini");
  14. System.out.println("Case 1.1. Display each section's data");
  15. iniconfig.load(new File("config.ini"));
  16. for(String section : iniconfig.getSections()) {
  17. SubnodeConfiguration subnode = iniconfig.getSection(section);
  18. ConfigurationNode node = subnode.getRootNode();
  19. System.out.println("[section]: "+node.getName());
  20. listKeyValue(subnode);
  21. }
  22. System.out.println();
  23. System.out.println("Case 1.2. Get property value direct by 'section.key'");
  24. System.out.println("[proterty]: account1.name, [value]: "+iniconfig.getProperty("account1.name"));
  25. System.out.println();
  26. System.out.println("Case 2. Write and save as config_new.ini");
  27. System.out.println("Case 2.1. New a section 'account3'");
  28. HierarchicalConfiguration.Node node = new HierarchicalConfiguration.Node();
  29. node.setName("account3");
  30. SubnodeConfiguration subnode = new SubnodeConfiguration(iniconfig, node);
  31. subnode.addProperty("name", "John");
  32. subnode.addProperty("age", "18");
  33. listKeyValue(subnode);
  34. iniconfig.getRootNode().addChild(node);
  35. iniconfig.save("config_new.ini");
  36. } catch (ConfigurationException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. }
  41. private static void listKeyValue(SubnodeConfiguration subnode) {
  42. Iterator<String> keys = subnode.getKeys();
  43. while(keys.hasNext()) {
  44. String key = keys.next();
  45. System.out.println("[key]: "+key+"\t[value]: "+subnode.getString(key));
  46. }
  47. }
  48. }
#如何讀取section下的value?
一、輪詢section及key
首先宣告一HierarchicalINIConfiguration,並且載入config.ini後進行sections的輪詢取得
SubnodeConfiguration instance,此時getRootNode(其Class Type為HierarchicalConfiguration.Node,可以透過debug mode搭配breakpoint辨認到,見圖二),這個node指的就是section! 而section下的keys and values可以由subnode instance取得!
二、由root node呼叫getProperty
再來另一種取得value的方式,可以由iniconfig透過getProperty 並指定"section.key"的方式取得

#如何建立section及key、value?
參考read時相關的instance class type,反推回來發現要建立section首先需要new一個HierarchicalConfiguration.Node,再來是new一SubnodeConfiguration需要帶入iniconfig及HierarchicalConfiguration.Node instances,而建立key、value則是透過addProperty的方式! 最後就是add到iniconfig下,成為其children! 此時,另外save一config file(config_new.ini)

最後DEMO如下:
圖一

圖二(若不知怎設定可參考)

留言