INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows操作系统中,这种配置文件的文件扩展名多为INI,INI是英文“初始化”(initialization)的缩写,正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。
本篇文章主要讲述一下INI文件格式以及如何使用java读写INI格式的文件。欢迎大家关注头条号“路人宅”。
文件格式
节(section)
节用方括号括起来,单独占一行,例如:
[section]
键(key)
键(key)又名属性(property),单独占一行用等号连接键名和键值,例如:
name=value
注释(comment)
注释使用英文分号(;)开头,单独占一行。在分号后面的文字,直到该行结尾都全部为注释,例如:
; comment text
读取ini的配置的格式如下:
[section1]
key1=value1
[section2]
key2=value2
…
具体实现读写INI格式文件的代码如下:
package com.yoodb.core.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.springframework.core.io.ClassPathResource;
/**
* @author 路人宅
* 来源:头条号"路人宅"
*/
public class INIUtil {
private static final Logger logger = Logger.getLogger(INIUtil.class.getName());
/**
* 用linked hash map 来保持有序的读取
*
*/
final LinkedHashMap<String,LinkedHashMap> coreMap = new LinkedHashMap<String, LinkedHashMap>();
/**
* 当前Section的引用
*/
String currentSection = null;
/**
* 读取
* @param file 文件
* @throws FileNotFoundException
*/
public INIUtil(File file) throws FileNotFoundException {
this.init(new BufferedReader(new FileReader(file)));
}
/***
* 重载读取
* @param path 给文件路径
* @throws FileNotFoundException
*/
public INIUtil(String path) throws FileNotFoundException {
this.init(new BufferedReader(new FileReader(path)));
}
/***
* 重载读取
* @param source ClassPathResource 文件,文件在resource 中时直接 new ClassPathResource("file name");
* @throws IOException
*/
public INIUtil(ClassPathResource source) throws IOException {
this(source.getFile());
}
void init(BufferedReader bufferedReader){
try {
read(bufferedReader);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("IO Exception:" + e);
}
}
/**
* 读取文件
* @param reader
* @throws IOException
*/
void read(BufferedReader reader) throws IOException {
String line = null;
while((line=reader.readLine())!=null) {
parseLine(line);
}
}
/**
* 转换
* @param line
*/
public void parseLine(String line) {
line = line.trim();
// 此部分为注释
if(line.matches("^\\#.*$")) {
return;
}else if (line.matches("^\\[\\S+\\]$")) {
// section
String section = line.replaceFirst("^\\[(\\S+)\\]$","$1");
addSection(section);
}else if (line.matches("^\\S+=.*$")) {
// key ,value
int i = line.indexOf("=");
String key = line.substring(0, i).trim();
String value =line.substring(i + 1).trim();
addKeyValue(currentSection,key,value);
}
}
/**
* 增加新的Key和Value
* @param currentSection
* @param key
* @param value
*/
void addKeyValue(String currentSection,String key, String value) {
if(!coreMap.containsKey(currentSection)) {
return;
}
MapchildMap = coreMap.get(currentSection);
childMap.put(key, value);
}
/**
* 增加Section
* @param section
*/
void addSection(String section) {
if (!coreMap.containsKey(section)) {
currentSection = section;
LinkedHashMapchildMap = new LinkedHashMap();
coreMap.put(section, childMap);
}
}
/**
* 获取配置文件指定Section和指定子键的值
* @param section
* @param key
* @return
*/
public String get(String section,String key){
if(coreMap.containsKey(section)) {
return get(section).containsKey(key) ? get(section).get(key): null;
}
return null;
}
/**
* 获取配置文件指定Section的子键和值
* @param section
* @return
*/
public Mapget(String section){
return coreMap.containsKey(section) ? coreMap.get(section) : null;
}
/**
* 获取这个配置文件的节点和值
* @return
*/
public LinkedHashMap<String, LinkedHashMap> get(){
return coreMap;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String fileName = "conf/shiro_base_auth.ini";
ClassPathResource cp = new ClassPathResource(fileName);
INIUtil ini = null;
try {
ini = new INIUtil(cp.getFile());
} catch (IOException e) {
logger.error("加载文件出错", e);
}
String section = "base_auth";
String va = ini.builder(ini, section);
System.out.println("默认固定值:\r\n" + va);
ini.parseLine("魔兽世界=最强套装");
va = ini.builder(ini, section);
System.out.println("变动后结果值:\r\n" + va);
}
private String builder(INIUtil ini,String section){
Setkeys = ini.get(section).keySet();
StringBuffer sb = new StringBuffer();
for (String key : keys) {
String value = ini.get(section, key);
sb.append(key).append(" = ")
.append(value).append("\r\n");
}
return sb.toString();
}
}
注意:在增加或修改base_auth.ini文件内容时不要存在空格以及特殊字符,否则无法读取文件值。
执行测试,运行结果如下:
默认固定值:
白百合 = 白百何首发声承认离婚
卓伟 = 原名韩炳江,被誉为“中国内地第一狗仔”
变动后结果值:
白百合 = 白百何首发声承认离婚
卓伟 = 原名韩炳江,被誉为“中国内地第一狗仔”
魔兽世界 = 最强套装