部分转 Java读取ini配置

转自:

http://www.cnblogs.com/Jermaine/archive/2010/10/24/1859673.html

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

[section1]
key1=value1

[section2]
key2=value2

。。。。

原blog中考虑:

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

代码如下:

  1 import java.io.BufferedReader;
  2 import java.io.FileReader;
  3 import java.io.IOException;
  4 import java.util.ArrayList;
  5 import java.util.HashMap;
  6 import java.util.List;
  7 import java.util.Map;
  8
  9 /**
 10  * 类名:读取配置类<br>
 11  * @author Phonnie
 12  *
 13  */
 14 public class ConfigReader {
 15
 16     /**
 17      * 整个ini的引用
 18      */
 19     private Map<String,Map<String, List<String>>>  map = null;
 20     /**
 21      * 当前Section的引用
 22      */
 23     private String currentSection = null;
 24
 25     /**
 26      * 读取
 27      * @param path
 28      */
 29     public ConfigReader(String path) {
 30         map = new HashMap<String, Map<String,List<String>>>();
 31         try {
 32             BufferedReader reader = new BufferedReader(new FileReader(path));
 33             read(reader);
 34         } catch (IOException e) {
 35             e.printStackTrace();
 36             throw new RuntimeException("IO Exception:" + e);
 37         }
 38
 39     }
 40
 41     /**
 42      * 读取文件
 43      * @param reader
 44      * @throws IOException
 45      */
 46     private void read(BufferedReader reader) throws IOException {
 47         String line = null;
 48         while((line=reader.readLine())!=null) {
 49             parseLine(line);
 50         }
 51     }
 52
 53     /**
 54      * 转换
 55      * @param line
 56      */
 57     private void parseLine(String line) {
 58         line = line.trim();
 59         // 此部分为注释
 60         if(line.matches("^\\#.*$")) {
 61             return;
 62         }else if (line.matches("^\\[\\S+\\]$")) {
 63             // section
 64             String section = line.replaceFirst("^\\[(\\S+)\\]$","$1");
 65             addSection(map,section);
 66         }else if (line.matches("^\\S+=.*$")) {
 67             // key ,value
 68             int i = line.indexOf("=");
 69             String key = line.substring(0, i).trim();
 70             String value =line.substring(i + 1).trim();
 71             addKeyValue(map,currentSection,key,value);
 72         }
 73     }
 74
 75
 76     /**
 77      * 增加新的Key和Value
 78      * @param map
 79      * @param currentSection
 80      * @param key
 81      * @param value
 82      */
 83     private void addKeyValue(Map<String, Map<String, List<String>>> map,
 84             String currentSection,String key, String value) {
 85         if(!map.containsKey(currentSection)) {
 86             return;
 87         }
 88
 89         Map<String, List<String>> childMap = map.get(currentSection);
 90
 91         if(!childMap.containsKey(key)) {
 92             List<String> list = new ArrayList<String>();
 93             list.add(value);
 94             childMap.put(key, list);
 95         } else {
 96             childMap.get(key).add(value);
 97         }
 98     }
 99
100
101     /**
102      * 增加Section
103      * @param map
104      * @param section
105      */
106     private void addSection(Map<String, Map<String, List<String>>> map,
107             String section) {
108         if (!map.containsKey(section)) {
109             currentSection = section;
110             Map<String,List<String>> childMap = new HashMap<String, List<String>>();
111             map.put(section, childMap);
112         }
113     }
114
115     /**
116      * 获取配置文件指定Section和指定子键的值
117      * @param section
118      * @param key
119      * @return
120      */
121     public List<String> get(String section,String key){
122         if(map.containsKey(section)) {
123             return  get(section).containsKey(key) ?
124                     get(section).get(key): null;
125         }
126         return null;
127     }
128
129
130
131     /**
132      * 获取配置文件指定Section的子键和值
133      * @param section
134      * @return
135      */
136     public Map<String, List<String>> get(String section){
137         return  map.containsKey(section) ? map.get(section) : null;
138     }
139
140     /**
141      * 获取这个配置文件的节点和值
142      * @return
143      */
144     public Map<String, Map<String, List<String>>> get(){
145         return map;
146     }
147
148 }

实际使用时,认为:

可以避免一个Key对应多个value的情况。即完全一一对应,则可以简化代码。

代码如下:

  1 import java.io.BufferedReader;
  2 import java.io.FileReader;
  3 import java.io.IOException;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7 import java.util.Scanner;
  8
  9 /**
 10  * 类名:读取配置类<br>
 11  * @author Phonnie
 12  *
 13  */
 14 public class ConfigReader {
 15
 16     /**
 17      * 整个ini的引用
 18      */
 19     private HashMap<String,HashMap<String, String> >  map = null;
 20     /**
 21      * 当前Section的引用
 22      */
 23     private String currentSection = null;
 24
 25     /**
 26      * 读取
 27      * @param path
 28      */
 29     public ConfigReader(String path) {
 30         map = new HashMap<String,HashMap<String, String> >();
 31         try {
 32             BufferedReader reader = new BufferedReader(new FileReader(path));
 33             read(reader);
 34         } catch (IOException e) {
 35             e.printStackTrace();
 36             throw new RuntimeException("IO Exception:" + e);
 37         }
 38
 39     }
 40
 41     /**
 42      * 读取文件
 43      * @param reader
 44      * @throws IOException
 45      */
 46     private void read(BufferedReader reader) throws IOException {
 47         String line = null;
 48         while((line = reader.readLine()) != null) {
 49             parseLine(line);
 50         }
 51     }
 52
 53     /**
 54      * 转换
 55      * @param line
 56      */
 57     private void parseLine(String line) {
 58         line = line.trim();
 59         // 去除空格
 60         //line = line.replaceFirst(" ", "");
 61         //line = line.replaceFirst(" ", "");
 62
 63         int i = line.indexOf("=");
 64         if (i > 0) {
 65             String left = line.substring(0, i);
 66             String right = line.substring(i + 1);
 67             if (line.charAt(i - 1) == ‘ ‘){
 68                 left = line.substring(0, i - 1);
 69             }
 70
 71             if (line.charAt(i + 1) == ‘ ‘){
 72                 right = line.substring(i + 2);
 73             }
 74             line = left + "=" + right;
 75            // System.out.println(line);
 76         }
 77
 78         // 此部分为注释
 79         if(line.matches("^\\#.*$")) {
 80             return;
 81         }else if (line.matches("^\\[\\S+\\]$")) {
 82             // section
 83             String section = line.replaceFirst("^\\[(\\S+)\\]$","$1");
 84             addSection(map,section);
 85         }else if (line.matches("^\\S+=.*$")) {
 86             // key ,value
 87             int index = line.indexOf("=");
 88             String key = line.substring(0, index).trim();
 89             String value =line.substring(index + 1).trim();
 90             addKeyValue(map,currentSection,key,value);
 91         }
 92     }
 93
 94
 95     /**
 96      * 增加新的Key和Value
 97      * @param map2
 98      * @param currentSection
 99      * @param key
100      * @param value
101      */
102     private void addKeyValue(HashMap<String, HashMap<String, String>> map2,
103             String currentSection,String key, String value) {
104         if(!map2.containsKey(currentSection)) {
105             return;
106         }
107
108         Map<String, String> childMap = map2.get(currentSection);
109
110         childMap.put(key, value);
111     }
112
113
114     /**
115      * 增加Section
116      * @param map2
117      * @param section
118      */
119     private void addSection(HashMap<String, HashMap<String, String>> map2,
120             String section) {
121         if (!map2.containsKey(section)) {
122             currentSection = section;
123             HashMap<String, String> childMap = new HashMap<String, String>();
124             map2.put(section, childMap);
125         }
126     }
127
128     /**
129      * 获取配置文件指定Section和指定子键的值
130      * @param section
131      * @param key
132      * @return
133      */
134     public String get(String section,String key){
135         if(map.containsKey(section)) {
136             if (get(section).containsKey(key))
137                 return get(section).get(key);
138             else
139                 return null;
140         }
141         return null;
142     }
143
144
145     /**
146      * 获取配置文件指定Section的子键和值
147      * @param section
148      * @return
149      */
150     public HashMap<String, String> get(String section){
151         if (map.containsKey(section))
152             return map.get(section);
153         else
154             return null;
155     }
156
157     /**
158      * 获取这个配置文件的节点和值
159      * @return
160      */
161     public HashMap<String, HashMap<String, String>> get(){
162         return map;
163     }
164 }

使用:

 1 import java.util.HashMap;
 2
 3 public class ReadConfig {
 4     public static void printMap( HashMap<String,HashMap<String, String> > map ) {
 5         System.out.println("map : ");
 6         for(String section : map.keySet()) {
 7             System.out.println(section);
 8             HashMap<String, String> mp = map.get(section);
 9             for(String key : mp.keySet()) {
10                 System.out.println(key + " : " + mp.get(key));
11             }
12             System.out.println();
13         }
14     }
15
16     public static void main(String[] argvs) throws Exception {
17         System.out.println("Hello World!");
18         String path = "config2.ini";
19         ConfigReader config = new ConfigReader(path);
20         HashMap<String,HashMap<String, String> > map = config.get();
21         printMap(map);
22     }
23 }

时间: 2024-10-29 05:05:36

部分转 Java读取ini配置的相关文章

Java读取ini配置

软件151    陶涛 读取ini的配置的格式如下: 1 2 3 4 5 6 7 [section1] key1=value1 [section2] key2=value2 .... 其中可能一个Key对应多个value的情况. 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

golang 读取 ini配置信息

package main //BY: [email protected]//这个有一定问题   如果配置信息里有中文就不行//[Server] ;MYSQL配置//Server=localhost   ;主机//golang 读取 ini配置信息//http://www.widuu.com/archives/02/961.htmlimport (  "fmt"  "github.com/widuu/goini"  //"runtime"  //&

python读取ini配置的类封装

此为基础封装,未考虑过多异常处理 类 # coding:utf-8 import configparser import os class IniCfg(): def __init__(self): self.conf = configparser.ConfigParser() self.cfgpath = '' def checkSection(self, section): try: self.conf.items(section) except Exception: print(">

java读取ini格式的文件

已上图就是ini文件的格式,经常在配置文件中用到. 1.核心代码: /** * 去除ini文件中的注释,以";"或"#"开头,顺便去除UTF-8等文件的BOM头 * @param source * @return */ private static String removeIniComments(String source){ String result = source; if(result.contains(";")){ result =

java读取properties配置文件总结

java读取properties配置文件总结 在日常项目开发和学习中,我们不免会经常用到.propeties配置文件,例如数据库c3p0连接池的配置等.而我们经常读取配置文件的方法有以下两种: (1).使用getResourceAsStream()方法读取配置文件. (2).使用InputStream()流去读取配置文件. 注意:在使用getResourceAsStream()读取配置文件时,要特别注意配置文件的路径的写法. this.getClass.getResourceAsStream(f

C# 读取INI

虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实际应用中,INI文件仍然有用武之地,尤其现在绿色软件的流行,越来越多的程序将自己的一些配置信息保存到了INI文件中. INI文件是文本文件,由若干节(section)组成,在每个带括号的标题下面,是若干个关键词(key)及其对应的值(Value): [Section] Key=Value VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面我介绍一个读写INI文件的C#类并利用该类保

php扩展开发-INI配置

php.ini文件是用来保存各项扩展配置的文件,每个扩展都或多或少需要有一个定制化的配置,ini文件是一个很好的保存配置的方式,我们来看下怎么在自己的扩展里,使用到ini的配置功能 //创建ini的配置项#include "php_ini.h" //ini配置的创建和全局变量的类似,通过宏定义创建一个结构体,来保存INI的配置项//参数说明://1,配置名称//2,配置值//3,作用域//4,修改时的回调函数,可以为NULL PHP_INI_BEGIN() PHP_INI_ENTRY(

Java编程:使用Java读取Excel文件内容

微软的ODBC驱动程序把工作表中的第一行作为列名(译者注:即字段名),工作表名作为数据库表名. 要通过JDBC访问工作表,我们还必须创建一个新的ODBC数据源,在Windows 2000系统上创建数据源的过程如下: 进入“控制面板” --> “管理工具” --> “数据源(ODBC)”,(译者注:打开后选择系统DSN),点击添加,在弹出窗口中选择“Driver do Microsoft Excel(*.xls)” 然后在数据源名处输入一个名字myexcel(译者注:相当于数据库名),然后点击“

第四章 INI配置——《跟我学Shiro》

之前章节我们已经接触过一些INI配置规则了,如果大家使用过如Spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即可以理解为是一个IoC/DI容器,但是区别在于它从一个根对象securityManager开始. 4.1 根对象SecurityManager 从之前的Shiro架构图可以看出,Shiro是从根对象SecurityManager进行身份验证和授权的:也就是所有操作都是自它开始的,这个对象是线程安全且真个应用只需要一个即可,因此Shiro提供了Securi