本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、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