您的位置:首页 > 其它

J2SE配置文件读取工具

2010-09-10 21:13 169 查看
为下周的实习做准备,有读取ini配置文件的需求,编写了这个类。

这个版本只实现了读取功能,以后可能继续实现写入功能

首先是异常类


packageconfigFile;

/**
*配置文件格式错误异常
*@authorAdministrator
*
*/
publicclassConfigFileFormatExceptionextendsException{

privatestaticfinallongserialVersionUID=-8622815453009039638L;

}



然后是配置文件操作类


packageconfigFile;

importjava.io.BufferedReader;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.util.jar.Attributes;

/**
*配置文件读取
*
*实现在J2SE下读取ini配置文件,配置文件的格式如下
*
*#注释
*[段名]
*变量名=变量值
*变量名="变量值"
*
*1、使用#表示注视行
*2、段名不指定则为默认段
*3、变量名允许使用的字符有[0-9a-zA-Z_-]
*4、变量值如果中间有空格,请使用引号,如"Variablevalue"
*
*@author石莹
*@version1.0
*
*/
publicclassConfigFile{

//DEBUG
privatefinalbooleanDEBUG=false;

//保存读入的数据
privateAttributesdata=newAttributes();

/**
*获得一个变量的值(默认段)
*@paramname要获得的变量名
*@return获得的值
*/
publicStringgetAttribute(Stringname){
returndata.getValue("Default-"+name);
}

/**
*获得一个变量的值
*@parampageName要获得的变量的段名(若为null,则表示使用默认段)
*@paramvariableName要获得的变量名
*@return获得的值
*/
publicStringgetAttribute(StringpageName,StringvariableName){
if(pageName==null)pageName="Default";
returndata.getValue(pageName+"-"+variableName);
}

/**
*读取配置文件
*@paramfilename 要读取的文件名
*@throwsIOException 如果打开文件发生IO错误,抛出异常
*@throwsConfigFileFormatException 如果配置文件格式错误,抛出异常
*/
publicvoidreadFile(Stringfilename)throwsIOException,ConfigFileFormatException{

//获得文件的读入流
BufferedReaderbr=newBufferedReader(newInputStreamReader(newFileInputStream(filename)));

//段名
StringpageName="Default";

//处理需要的StringBuffer
StringBufferbuffer=newStringBuffer();

//每次循环处理一行
StringlineStr=null;
while((lineStr=br.readLine())!=null){
//忽略字符串前导空白和尾部空白
lineStr=lineStr.trim();

//如果是空行,跳过
if(lineStr.length()==0)
continue;

//如果是注视行,跳过
if(lineStr.charAt(0)=='#')
continue;

//如果是段标记,更新当前段段名
if(lineStr.charAt(0)=='['){
//清空buffer
buffer.delete(0,buffer.length());
//读取段名到buffer中
intn=1;
while(lineStr.charAt(n)!=']'){
buffer.append(lineStr.charAt(n++));
}
if(buffer.length()!=0){
pageName=buffer.toString().trim();
}
continue;
}

//读取变量名
Stringname=null;
//清空buffer
buffer.delete(0,buffer.length());
//读取变量名到buffer中
intindex=0;
while(lineStr.charAt(index)!='='){
buffer.append(lineStr.charAt(index++));
}
if(buffer.length()!=0){
name=buffer.toString().trim();
}else{
thrownewConfigFileFormatException();
}

//读取值
index++; //跳过字符=
Stringvalue=null;
//清空buffer
buffer.delete(0,buffer.length());
//开始读取值
while(lineStr.charAt(index)=='')
index++;
if(lineStr.charAt(index)=='"'){
//如果第一个字符是",那么根据规则使用"作为结束符
index++;
//如果字符串结束或找到结束符,循环结束
while(index<lineStr.length()&&
lineStr.charAt(index)!='"'){
buffer.append(lineStr.charAt(index++));
}
if(index<lineStr.length()){
//如果当前字符串游标合法,说明找到了结束符",查找有效
value=buffer.toString().trim();
}else{
//否则,抛出格式错误异常
thrownewConfigFileFormatException();
}
}else{
//否则,使用第一个不是[a,z],[A,Z],[0~9]的字符作为结束符
while(index<lineStr.length()&&
((lineStr.charAt(index)>='a'&&lineStr.charAt(index)<='z')||
(lineStr.charAt(index)>='A'&&lineStr.charAt(index)<='Z')||
(lineStr.charAt(index)>='0'&&lineStr.charAt(index)<='9')||
lineStr.charAt(index)=='')){
buffer.append(lineStr.charAt(index++));
}
value=buffer.toString().trim();
}

//保存读取的值映射
try{
data.put(newAttributes.Name(pageName+"-"+name),value);
}catch(Exceptione){
thrownewConfigFileFormatException();
}

//debug
if(DEBUG)
System.out.println(pageName+"-"+name+"="+value);////////
}
}
}



测试

在c盘根目录下存放一个c.ini的配置文件,文件内容如下


test=def

[page]
test="pagetest"


使用下面的程序测试


importjava.io.IOException;

importconfigFile.ConfigFile;
importconfigFile.ConfigFileFormatException;

publicclasstest{

/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub

ConfigFilecf=newConfigFile();

try{
cf.readFile("c:\\c.ini");
}catch(IOExceptione){
e.printStackTrace();
}catch(ConfigFileFormatExceptione){
e.printStackTrace();
}

System.out.println(cf.getAttribute("test"));
System.out.println(cf.getAttribute("page","test"));
}
}


输出结果


def
pagetest

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航