代码改变世界

Java读取ini配置

2010-10-24 11:31  花晓霜  阅读(11874)  评论(0编辑  收藏  举报

不够通用,呵呵。

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

[section1]
key1=value1

[section2]
key2=value2

。。。。

其中可能一个Key对应多个value的情况。

代码如下:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 类名:读取配置类<br>
 * @author Phonnie
 *
 */
public class ConfigReader {
	
	/**
	 * 整个ini的引用
	 */
	private Map<String,Map<String, List<String>>>  map = null;
	/**
	 * 当前Section的引用
	 */
	private String currentSection = null;
	
	/**
	 * 读取
	 * @param path
	 */
	public ConfigReader(String path) {
		map = new HashMap<String, Map<String,List<String>>>();
		try {
			BufferedReader reader = new BufferedReader(new FileReader(path));
			read(reader);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("IO Exception:" + e); 
		}
		
	}

	/**
	 * 读取文件
	 * @param reader
	 * @throws IOException
	 */
	private void read(BufferedReader reader) throws IOException {
		String line = null; 
		while((line=reader.readLine())!=null) {
			parseLine(line);
		}
	}
	
	/**
	 * 转换
	 * @param line
	 */
	private void parseLine(String line) {
		line = line.trim();
		// 此部分为注释
		if(line.matches("^\\#.*$")) {
			return;
		}else if (line.matches("^\\[\\S+\\]$")) {
			// section
			String section = line.replaceFirst("^\\[(\\S+)\\]$","$1");
			addSection(map,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(map,currentSection,key,value);
		}
	}


	/**
	 * 增加新的Key和Value
	 * @param map
	 * @param currentSection
	 * @param key
	 * @param value
	 */
	private void addKeyValue(Map<String, Map<String, List<String>>> map,
			String currentSection,String key, String value) {
		if(!map.containsKey(currentSection)) {
			return;
		}
		
		Map<String, List<String>> childMap = map.get(currentSection);
		
		if(!childMap.containsKey(key)) {
			List<String> list = new ArrayList<String>();
			list.add(value);
			childMap.put(key, list);
		} else {
			childMap.get(key).add(value);
		}
	}


	/**
	 * 增加Section
	 * @param map
	 * @param section
	 */
	private void addSection(Map<String, Map<String, List<String>>> map,
			String section) {
		if (!map.containsKey(section)) {
			currentSection = section;
			Map<String,List<String>> childMap = new HashMap<String, List<String>>();
			map.put(section, childMap);
		}
	}
	
	/**
	 * 获取配置文件指定Section和指定子键的值
	 * @param section
	 * @param key
	 * @return
	 */
	public List<String> get(String section,String key){
		if(map.containsKey(section)) {
			return  get(section).containsKey(key) ?
					get(section).get(key): null;
		}
		return null;
	}
	
	
	
	/**
	 * 获取配置文件指定Section的子键和值
	 * @param section
	 * @return
	 */
	public Map<String, List<String>> get(String section){
	    return 	map.containsKey(section) ? map.get(section) : null;
 	}
	
	/**
	 * 获取这个配置文件的节点和值
	 * @return
	 */
	public Map<String, Map<String, List<String>>> get(){
		return map;
	}
	
}