一个简单实用的ini解析算法

来源:互联网 发布:学电脑编程先学什么 编辑:程序博客网 时间:2024/05/20 21:57

主程序先调用load()方法,继而调用其他public方法。


import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;import java.util.regex.Pattern;public class IniParser {/* INI文件中的所有节点 */private Map<String, Map<String, String>> nodes = new HashMap<String, Map<String, String>>();public IniParser() {super();}/** * 根据输入流加载INI文件 */public void load(InputStream in) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(in));String nodeName = null;// 当前节点的名字String line = br.readLine();while (null != line) {line = line.trim();// 去前后空格if (0 == line.length() || isComment(line)) {// 忽略空行和注释line = br.readLine();continue;} else if (isNode(line)) {// 节点处理nodeName = getNodeName(line);nodes.put(nodeName, new HashMap<String, String>());line = br.readLine();continue;} else {// 节点属性处理nodes.get(nodeName).put(this.getPropertyName(line),this.getPropertyValue(line));line = br.readLine();}}}/** * 返回所有节点的名字 */public String[] getNodeNames() {return this.nodes.keySet().toArray(new String[] {});}/** * 返回节点的所有属性名 */public String[] getPropertyNames(String nodeName) {if (this.nodes.containsKey(nodeName)) {return this.nodes.get(nodeName).keySet().toArray(new String[] {});} else {return new String[0];}}/** * 返回节点下属性的值 */public String getPropertyValue(String nodeName, String propertyName) {Map<String, String> properties = this.nodes.get(nodeName);if (null != properties && properties.containsKey(propertyName)) {return properties.get(propertyName);} else {return "";}}// 判断是否为注释行private boolean isComment(String line) {return Pattern.matches(";.*", line);}// 判断是否为节点private boolean isNode(String line) {return Pattern.matches("\\[.+\\]", line);}// 获得节点名private String getNodeName(String line) {String s = line.replaceFirst("^\\[", "");s = s.replaceFirst("\\]$", "");return s.trim();}// 获得属性名private String getPropertyName(String line) {String s = line.replaceFirst("=.+", "");return s.trim();}// 获得属性值private String getPropertyValue(String line) {String name = line.replaceFirst("=.+", "");String s = line.replaceFirst(name, "");s = s.replaceFirst("=", "");return s.trim();}}


0 0
原创粉丝点击