Java基础之如何读取INI格式文件-java读写文件

INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows操作系统中,这种配置文件的文件扩展名多为INI,INI是英文“初始化”(initialization)的缩写,正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。

Java基础之如何读取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文件内容时不要存在空格以及特殊字符,否则无法读取文件值。

执行测试,运行结果如下:

默认固定值:

白百合 = 白百何首发声承认离婚

卓伟 = 原名韩炳江,被誉为“中国内地第一狗仔”

变动后结果值:

白百合 = 白百何首发声承认离婚

卓伟 = 原名韩炳江,被誉为“中国内地第一狗仔”

魔兽世界 = 最强套装

推荐阅读