java 读写 ini 配置文件【IDEA】

862 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、ini4j简介

INI文件是一种无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统上,许多程序也会采用INI文件做为配置文件之用。Windows操作系统后来以注册表的形式取代掉INI档。INI文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。有时候,INI文件也会以不同的扩展名,如“.CFG”、“.CONF”、或是“.TXT”代替。

定义:ini文件主要由三部分构成,paramaters、section和comment组成,其中paramaters由键值对构成,用来存储数据,section是一个区块,每个区块下有所属的键值对,comment是注释,对paramaters和section进行标注和解释。 若在maven项目中的pom.xml中配置:

<dependency>
    <groupId>org.ini4j</groupId>
    <artifactId>ini4j</artifactId>
    <version>0.5.4</version>
</dependency>

若不是maven项目,下载 ini4j 解压ini4j-0.5.4-bin.zip后,在项目结构模块里,点击+号,将 ini4j-0.5.4.jar 导入工程。 在这里插入图片描述

二、添加配置文件 env.ini

[dev]
url="dev-url"
user="dev-user"
password="dev-password"

[testing]
url=""
user=""
password=""

三、添加IniUtils

import org.ini4j.Ini;
import org.ini4j.Profile;
import org.ini4j.Wini;

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

public class IniUtils {
    public static void main(String[] args) {
        try {
            readIni();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    private static void readIni() throws Exception {
        Wini ini = new Wini(new File("config/env.ini"));
        // 读
        Ini.Section section = ini.get("dev");
        String url = section.get("url");
        String user = section.get("user");
        String password = section.get("password");
        System.out.println(url);
        System.out.println(user);
        System.out.println(password);

        // or just use java.util.Map interface
        Map<String, String> map = ini.get("dev");
        String url1 = map.get("url");
        String user1 = map.get("user");
        String password1 = map.get("password");
        System.out.println(url1);
        System.out.println(user1);
        System.out.println(password1);

        // get all section names
        Set<String> sectionNames = ini.keySet();
        for (String sectionName : sectionNames) {
            Profile.Section section1 = ini.get(sectionName);
            System.out.println(sectionName);
        }

        // 写
        ini.put("sleepy", "age", 89);
        ini.put("sleepy", "weight", 45.6);
        ini.store();
    }
}

四、读写

读取.ini文件

/**
 * 存储文件中的内容
 */
@Data
public class Ini4jFileVo {
    private String ip;
    private String ipPort;
    private String isUsed;
}

/**
* 读取ini文件的内容
* @param iniFile ini文件
* @param fileContent ini文件中的key对应文件中的section,value对应i你文件section下的一个或多个key值
* @return
* @throws IOException
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static Ini4jFileVo readIniFile(File iniFile, Map<String,List<String>> fileContent) throws IOException, NoSuchFieldException, IllegalAccessException {
    Ini4jFileVo fileVo = new Ini4jFileVo();
    Ini ini = new Ini();
    ini.load(iniFile);
    Section section = null;
    Field field = null;
    for(String key : fileContent.keySet()){
        section = ini.get(key);
        for (String value: fileContent.get(key)) {
            field = fileVo.getClass().getDeclaredField(value);
            field.setAccessible(true);
            field.set(fileVo, section.get(value));
        }
    }

    /**
      * 这个是简略版的
      *    Section section = ini.get("ldap");
      *  fileVo.setIp(section.get("ip"));
      *   fileVo.setIpPort(section.get("port" ));
      *
      *  section = ini.get("test");
      *   fileVo.setIsUsed(section.get("isUsed"));
      */
    return fileVo;
}

//测试
@Test
public void testReadFile(){
    File file = new File("D:\abc\test.ini");
    Map<String,List<String>> fileContent = new HashMap<>();
    fileContent.put("ldap",Arrays.asList("ip","ipPort"));
    fileContent.put("test",Arrays.asList("isUsed"));
    Ini4jFileVo fileVo = Ini4jUtils.readIniFile(file,fileContent);
    System.out.println(fileVo);
}

//打印结果----Ini4jFileVo(ip=1.1.1.1, ipPort=8567, isUsed=true)

修改.ini文件

/**
* 修改文件内容
* @param iniFile ini文件
* @param updateData 更新的数据
* @throws IOException
*/
public static void updateIniFile(File iniFile,Map<String,Map<String,String>> updateData) throws IOException {
    Ini ini = new Ini();
    ini.load(iniFile);
    Section section = null;
    Map<String,String> dataMap = null;
    for (String sect : updateData.keySet()){
        section = ini.get(sect);
        dataMap = updateData.get(sect);
        for (String key : dataMap.keySet()){
            section.put(key,dataMap.get(key) == null ? "" :
            dataMap.get(key));
        }
    }
    ini.store(iniFile);
}

@Test
public void testUpdateFile(){
    //修改
    File file = new File("D:\abc\test.ini");
    Map<String,Map<String,String>> updateData = new HashMap<>();
    Map<String,String> ldap = new
    HashMap<>();
    ldap.put("ip","8.8.8.8");
    updateData.put("ldap",ldap);
    Ini4jUtils.updateIniFile(file,updateData);


    Map<String,List<String>> fileContent = new HashMap<>();
    fileContent.put("ldap",Arrays.asList("ip","ipPort"));
    fileContent.put("test",Arrays.asList("isUsed"));
    Ini4jFileVo fileVo = Ini4jUtils.readIniFile(file,fileContent);
    System.out.println(fileVo);
}

//测试结果----Ini4jFileVo(ip=8.8.8.8, ipPort=8567, isUsed=true)

注意: ini4j这个jar包对\、=做了转义处理,如果其他框架调用这个生成的文件可能会出现奇怪的问题,这个是我在开发的时候遇到的bug

参考:java 读取ini配置文件