Java读写 INI 格式文件详细说明

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


        本篇文章主要讲述一下INI文件格式以及如何使用java读写INI格式的文件。如果对本站www.yoodb.com感兴趣,欢迎收藏素文宅。


文件格式

节(section)

节用方括号括起来,单独占一行,例如:

[section]

键(key)

键(key)又名属性(property),单独占一行用等号连接键名和键值,例如:

name=value

注释(comment)

注释使用英文分号(;)开头,单独占一行。在分号后面的文字,直到该行结尾都全部为注释,例如:

; comment text


读取ini的配置的格式如下:

[section1]
key1=value1
 
[section2]
key2=value2
…


具体实现读写INI格式文件的代码如下:

package com.yoodb.core.shiro.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 素文宅
 * 来源:www.yoodb.com
 */
public class INIUtil {
private static final Logger logger = Logger.getLogger(INIUtil.class.getName());
    
    /**
     * 用linked hash map 来保持有序的读取
     * 
     */
    final LinkedHashMap<String,LinkedHashMap<String, String>>  coreMap = new LinkedHashMap<String, LinkedHashMap<String,String>>();
    /**
     * 当前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;
        }
        Map<String, String> childMap = coreMap.get(currentSection);
        childMap.put(key, value);
    }
 
 
    /**
     * 增加Section
     * @param section
     */
    void addSection(String section) {
        if (!coreMap.containsKey(section)) {
            currentSection = section;
            LinkedHashMap<String,String> childMap = new LinkedHashMap<String,String>();
            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 Map<String, String> get(String section){
        return  coreMap.containsKey(section) ? coreMap.get(section) : null;
    }
     
    /**
     * 获取这个配置文件的节点和值
     * @return
     */
    public LinkedHashMap<String, LinkedHashMap<String, String>> 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("yoodb/**=user");
            va = ini.builder(ini, section);
            System.out.println("变动后结果值:\r\n" + va);
        }
    
    private String builder(INIUtil ini,String section){
        Set<String> keys = 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();
    }
     
}


shiro_base_auth.ini文件,因公司业务需要封装CAS-client因此写的内容默认信息如下:

[base_auth]
/shiro-cas=casFilter
/logout=logoutFilter
/users/**=user

注意:在增加或修改shiro_base_auth.ini文件内容时不要存在空格以及特殊字符。


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

默认固定值:
/shiro-cas = casFilter
/logout = logoutFilter
/users/** = user
变动后结果值:
/shiro-cas = casFilter
/logout = logoutFilter
/users/** = user
yoodb/** = user

评论

  1. #2

    yoodb(2016/10/28 11:41:03)
    不错的网站主题,看着相当舒服,确实不错!

  2. #1

    admin(2016/10/14 21:02:39)
    博客做得好漂亮哦,Very Good!

分享:

支付宝

微信