xxx.ini文件解析

217 阅读2分钟

xxx.ini文件解析

简介

基于commons-configuration2对xxx.ini文件进行解析与修改操作

xxx.ini文件格式示例

.ini文件是一种常见的配置文件格式,用于存储程序的配置信息,它通常包含键值对,组织成不同的节(section)

[sectionName1]
key1 = value1
key2 = value2
...
[sectionName2]
keyn = valuen
keym = valuem
...
  • 节(section):用方括号包起来的部分。例如 [sectionName]
  • 键值对:节下面每行一个键值对,用“=”分隔,格式为key = value。

代码示例

项目关键依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-configuration2</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

commons-configuration2依赖commons-lang3 版本3.14.0,commons-lang3在3.14.0删除了isAllBlank()、isAllEmpty()以及isAnyEquals()等方法,如果项目中commons-lang3版本较低,需要进行适配修改

xxx.ini文件解析

File iniFile = new File("**\xxx.ini");
// 创建INI配置对象
INIConfiguration config = new INIConfiguration();
try {
    // 加载配置文件
    FileHandler fileHandler = new FileHandler(config);
    fileHandler.load(iniFile);
    
    // 获取所有的节
    Set<String> sections = config.getSections()
    
    // 获取指定节的配置对象
    SubnodeConfiguration sectionConfig = config.getSection("sectionName");
   
    // 根据节获取指定键的value值
    Object obj = sectionConfig.getProperty("key");
    String strValue = sectionConfig.getString("strkey");
    int intValue = sectionConfig.getInt("intKey"); 
    
    //  根据配置对象获取指定节下键的value值
    Object obj = config.getProperty("sectionName.key");
    
    // 在指定节下更新键值对或者插入键值对信息
    subConfig.setProperty("key","value");
    config.setProperty("sectionName.key","value");
    
    // 保存修改内容
    fileHandler.save(iniFile);
} catch (ConfigurationException e) {
    e.printStackTrace();
}

xxx.ini解析工具类

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.configuration2.INIConfiguration;
import org.apache.commons.configuration2.SubnodeConfiguration;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.commons.configuration2.io.FileHandler;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * xxx.ini文件解析工具类
 * 基于commons-configuration2解析
 */
@Slf4j
public class IniUtils {
    private final File iniFile;
    private final INIConfiguration iniConfiguration;
    private final FileHandler fileHandler;
    private final Map<String, SubnodeConfiguration> sectionConfigMap = new HashMap<>();

    public IniUtils(String iniFilePath) {
        this(new File(iniFilePath));
    }

    public IniUtils(File iniFile) {
        if (iniFile == null || !iniFile.exists()) {
            throw new BusinessException("ini file not exist");
        }
        this.iniFile = iniFile;
        this.iniConfiguration = new INIConfiguration();
        this.fileHandler = new FileHandler(iniConfiguration);
        try {
            fileHandler.load(iniFile);
            Set<String> sections = iniConfiguration.getSections();
            for (String section : sections) {
                SubnodeConfiguration subnodeConfiguration = iniConfiguration.getSection(section);
                sectionConfigMap.put(section, subnodeConfiguration);
            }
        } catch (ConfigurationException e) {
            log.error(".ini文件解析失败", e);
            throw new IniParseException("ini file parsing error");
        }
    }

    public Set<String> getSections() {
        return sectionConfigMap.keySet();
    }


    /**
     * 获取指定section的配置信息
     *
     * @param sectionName section名称
     * @return SubnodeConfiguration
     */
    public SubnodeConfiguration getSubnodeConfiguration(String sectionName) {
        return sectionConfigMap.get(sectionName);
    }

    /**
     * 获取指定节(section)中的属性值
     *
     * @param sectionName 节名称
     * @param key         属性键名
     * @return 属性值
     */
    public Object getProperty(String sectionName, String key) {
        SubnodeConfiguration subnodeConfiguration = sectionConfigMap.get(sectionName);
        if (subnodeConfiguration == null) {
            e.printStackTrace();
        }
        return subnodeConfiguration.getProperty(key);
    }

    /**
     * 获取指定节(section)中的字符串值
     *
     * @param sectionName 节名称
     * @param key         属性键名
     * @return 指定键的字符串值
     */
    public String getString(String sectionName, String key) {
        SubnodeConfiguration subnodeConfiguration = sectionConfigMap.get(sectionName);
        if (subnodeConfiguration == null) {
            throw new BusinessException("section not exist");
        }
        return subnodeConfiguration.getString(key);
    }

    /**
     * 获取指定配置节点中指定键的整数值
     *
     * @param sectionName 节名称
     * @param key         属性键名
     * @return 指定键的整数值
     */
    public int getInt(String sectionName, String key) {
        SubnodeConfiguration subnodeConfiguration = sectionConfigMap.get(sectionName);
        if (subnodeConfiguration == null) {
            e.printStackTrace();
        }
        return subnodeConfiguration.getInt(key);
    }

    /**
     * 设置属性值
     *
     * @param sectionName 节名称
     * @param key         属性键名
     * @param value       属性值
     */
    public void setProperty(String sectionName, String key, Object value) {
        SubnodeConfiguration subnodeConfiguration = sectionConfigMap.get(sectionName);
        if (subnodeConfiguration == null) {
            iniConfiguration.setProperty(sectionName + "." + key, value);
        } else {
            subnodeConfiguration.setProperty(key, value);
        }
        try {
            fileHandler.save(iniFile);
        } catch (ConfigurationException e) {
            log.error("保存ini文件失败", e);
            e.printStackTrace();
        }
    }
}