Java有序读取配置文件,有序读取ini配置文件

soゝso 2016-08-22 15:49:59 4485

本项目中对 shiro  的权限配置,需要有序配置,因为权限控制是个漏斗形式匹配模式。

如:第一个匹配不中就找第二个,这样的话如果顺序随机或者乱了的话,直接匹配第二个了。或者第三个。

本工具实现于给ini 配置文件读取,其实换做其他配置文件(properties )都可以。你看下思路即可了解。

提供了三个构造方法:

一、参数为文件(File)。

/**
 * 读取
 * @param file 文件
 * @throws FileNotFoundException 
 */
public INI4j(File file) throws FileNotFoundException {
	this.init(new BufferedReader(new FileReader(file)));
}

二、参数为Path文件路径

/***
 * 重载读取
 * @param path 给文件路径
 * @throws FileNotFoundException 
 */
public INI4j(String path) throws FileNotFoundException {
    this.init(new BufferedReader(new FileReader(path)));
}

三、参数为ClassPathResource。

/***
 * 重载读取
 * @param source ClassPathResource 文件,如果文件在resource 里,那么直接 new ClassPathResource("file name");
 * @throws IOException 
 */
public INI4j(ClassPathResource source) throws IOException {
	this(source.getFile());
}

全部代码:

package com.sojson.core.config;
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 org.springframework.core.io.ClassPathResource;
/**
 * 
 * 开发公司:SOJSON在线工具 <p>
 * 版权所有:© www.sojson.com<p>
 * 博客地址:http://www.sojson.com/blog/  <p>
 * <p>
 * 
 * 有序读取 ini配置文件
 * 
 * <p>
 * 
 * 区分 责任人 日期    说明<br/>
 * 创建 周柏成 2016年6月2日  <br/>
 *
 * @author zhou-baicheng
 * @email  so@sojson.com
 * @version 1.0,2016年6月2日 <br/>
 * 
 */
public class INI4j {
    
    /**
     * 用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 INI4j(File file) throws FileNotFoundException {
		this.init(new BufferedReader(new FileReader(file)));
	}
	/***
	 * 重载读取
	 * @param path 给文件路径
	 * @throws FileNotFoundException 
	 */
	public INI4j(String path) throws FileNotFoundException {
	    this.init(new BufferedReader(new FileReader(path)));
	}
	/***
	 * 重载读取
	 * @param source ClassPathResource 文件,如果文件在resource 里,那么直接 new ClassPathResource("file name");
	 * @throws IOException 
	 */
	public INI4j(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
     */
    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;
    }
     
}

调用方式:

ClassPathResource cp = new ClassPathResource("shiro_base_auth.ini");
INI4j ini = null;
try {
	ini = new INI4j(cp.getFile());
} catch (IOException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

配置文件书写规范(本范例配置文件):

[base_auth]
/u/**=anon
/user/**=simple,login
/js/**=anon
/css/**=anon 
/open/**=anon

#不用校验地址是否有权限
/permission/selectPermissionById.shtml=simple,login
/member/onlineDetails/**=simple,login
/role/mypermission.shtml=simple,login
/role/getPermissionTree.shtml=simple,login
/role/selectRoleByUserId.shtml=simple,login


#需要根据地址校验有无权限
/permission/**=simple,login,permission
/role/**=simple,login,permission
/member/**=simple,login,permission




/**=simple,login

版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/139.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

相关文章
Java有序读取配置文件有序读取ini配置文件
Shiro教程(六)Shiro整体的配置文件
Shiro教程,Shiro 配置文件详细解释,Shiro自定义Filter配置
Elasticsearch教程,Elasticsearch配置文件 — elasticsearch.yml
基于Centos7以上的JAVA相关配置(一)
Shiro教程(三)Shiro web.xml中Filter配置配置注意事项
Java web.xml 配置技巧—动态欢迎页地址
Shiro教程(四)Shiro + Redis配置
Urlrewrite Java 伪静态 urlrewrite.xml 配置参数描述
Redis 密码、端口、ip绑定配置,bat编写运行redis
最新文章
Springboot + Mybatis,数据库多数据源配置项目Demo【源码下载】 454
Mac mtr 安装并使用,mrt: command not found 53
Java 集成阿里云消息队列,日志消息存储 177
域名备案注意事项,网站域名ICP备案快速通过攻略【干货分享】 181
Springboot 集成Aliyun MQ消息队列,Aliyun 消息队列配置及代码实现 290
SpringBoot 集成Spring-data-redis,redis对象序列化存储 645
天气API,全国天气 JSON API接口,可以获取十五天的天气预报 239
Springboot + Freemarker 集成配置 954
DNS查询, DNS测速检查接口,DNS测速接口 74
Mysql 并发插入、存在不插入,存在更新操作 248
最热文章
Elasticsearch教程(四) elasticsearch head 插件安装和使用 120899
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 78099
Elasticsearch教程(六) elasticsearch Client创建 77061
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 73136
Elasticsearch教程(二),IK分词器安装 71340
Elasticsearch教程(一),全程直播(小白级别) 60722
Elasticsearch教程(五) elasticsearch Mapping的创建 57908
Elasticsearch教程(三),IK分词器安装 (极速版) 55572
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 51660
Elasticsearch权威指南-中文.pdf,Elasticsearch 中文文档下载 44427

骚码加入我们 / 千人QQ群:259217951

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

正在加载... ...