java中读写属性文件

最近学习用到的java技术,保留些比较好的文章:

下面的文章来自CSDN hyde82的专栏,因为很实用,所以就摘下来放这里

无论是有图形化的选项配置对话框,或者是系统提供的注册表,文本形式的本地配置文件依然是最牢靠、应用最广泛的配置信息保存形式。配置信息的一般模式就是一个配置项对应一个值,前者一般是个字符串,后者可能是数字或者字符串或者别的什么。在传统win32编程中有系统提供的api供我们解读.ini文件,后来也有操作注册表的封装好的api,在.net中更是有解读XML形式.config文件的现成方法。在Java中,对配置文件的使用进行封装也是十分有意义的。 

  封装应该达到这样的效果:应用只管从配置信息进行按名读取值、设置值、保存等操作,而不需要关心具体以什么文件格式保存、如何解析。文件格式(纯文本?XML?数据库?)、IO方式(本地文件?远程文件?控制台流?)在封装类内部的变更,都不会影响应用对配置信息的感知。 

  从键名-值的对应关系以及文件的存取,我们最容易想到的就是java.util.Properties对象,他是HashTable的子类,保存的就是很多组键名-值的对应二原组,并提供快速的查询和直接的从文件读取、保存为文件的方法。具体请参考相关文档,我们直接看程序。 

  首先自定义一个异常: 



  然后是我们的封装类: 

//Configuration.java 
package configuration; 
import java.io.*; 
import java.util.*; 
import configuration.*; 

public class Configuration { 
private Properties config=new Properties();//记录配置项 
private String fn=null;//记录配置文件名 

//此构造方法用于新建配置文件 
public Configuration(){} 

//从指定文件名读入配置信息 
public Configuration(String fileName) 
throws ConfigurationException { 
try { 
FileInputStream fin = new FileInputStream(fileName); 
config.load(fin); //载入文件 
fin.close(); 

catch (IOException ex) { 
throw new ConfigurationException 
("无法读取指定的配置文件:"+fileName); 

fn=fileName; 


//指定配置项名称,返回配置值 
public String getValue(String itemName){ 
return config.getProperty(itemName); 


//指定配置项名称和默认值,返回配置值 
public String getValue(String itemName, 
String defaultValue){ 
return config.getProperty(itemName,defaultValue); 


//设置配置项名称及其值 
public void setValue(String itemName,String value){ 
config.setProperty(itemName,value); 
return; 


//保存配置文件,指定文件名和抬头描述 
public void saveFile(String fileName,String description) 
throws ConfigurationException { 
try { 
FileOutputStream fout 
= new FileOutputStream(fileName); 
config.store(fout, description);//保存文件 
fout.close(); 

catch (IOExeption ex) { 
throw new ConfigurationException 
("无法保存指定的配置文件:"+fileName); 



//保存配置文件,指定文件名 
public void saveFile(String fileName) 
throws ConfigurationException { 
saveFile(fileName,""); 


//保存配置文件,采用原文件名 
public void saveFile() throws ConfigurationException { 
if(fn.length()==0) 
throw new ConfigurationException 
("需指定保存的配置文件名"); 
saveFile(fn); 





  从这个封装类我们可以看到,实例化对象的时候我们可以指定一个文件名使得从中读取配置信息,通过getValue方法取得属性值,setValue方法设置属性值,saveFile方法保存文件。然后我们具体来看看如何使用: 

//SetConfig.java 
import configuration.*;//包含这个包方能使用配置类 
import java.io.*; 

public class SetConfig { 
public static void main(String[] args) { 
try { 
Configuration config = new Configuration(); 
//设置一些属性值 
config.setValue("Max_Users_Count", "50"); 
config.setValue("Max_OpenedFile_Count", "20"); 
//保存文件 
config.saveFile("system.conf", 
"Sytem Global Configuration"); 

catch (ConfigurationException ex) { 
//捕获我们自定义的异常 
ex.printStackTrace(); 





  这段程序新建了一个配置,设置了两个配置项:Max_Users_Count为50;Max_OpenedFile_Count为20。最后将这个配置保存为system.conf文件,并加入抬头注释"Sytem Global Configuration"。执行之后,在程序所在目录下产生了一个system.conf文件,我们用纯文本编辑器打开看看内容到底是什么: 

#Sytem Global Configuration 
#Mon Aug 02 23:43:39 PDT 2004 
Max_OpenedFile_Count=20 
Max_Users_Count=50 

  可以看到,第一行写入了我们加入的抬头注释,第二行自动产生了一个时间,后面两行用<配置项名称>=<配置值>的形式记录了配置信息。下面我们来读取这个配置文件: 

//ReadConfig.java 
import configuration.*; 

public class ReadConfig { 
public static void main(String[] args) { 
try { 
//读取指定文件 
Configuration config 
= new Configuration("system.conf"); 
//获取特定值 
System.out.println 
(config.getValue("Max_Users_Count") + 
" users can be actived at the same time"); 
//指定默认值 
System.out.println 
(config.getValue("Max_OpenedFile_Count", "10") + 
" files can be opened at the same time"); 

catch (ConfigurationException ex) { 
ex.printStackTrace(); 




  系统输出了 

50 users can be actived at the same time 
20 files can be opened at the same time 

这样的信息。表明我们成功读取了配置信息。 

  这样我们的封装类可以胜任普通的配置信息操作工作了。而且对于大多数的情况,这个类也足够用了。这里的代码都是可复用的,大家可以直接拷贝到自己的工程中去。最后说明:这些属性值当然可以自己在文件里面改动,而且这也是配置文件最常见的使用方式;#号开头的都表示注释,可以任意添加和删除。 

  任务完成了,但是还并不完美。采用Properties最大的方便就是有现成的查询、设置、文件存取方法,但是这样的<配置项名称>=<配置值>格式只是方便了在Java中的使用,考虑到系统将来的扩展性或者开发平台的迁移,都是欠妥的。下一次我们来试试利用DOM封装XML格式的配置文件。 


下面是根据我的项目,对上面的类稍作了一些修改,大部分复制上面的代码,很多注解都还没改 

package gov.szghrs.base.utils; 

import gov.szghrs.base.exception.ConfigurationException; 

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.URL; 
import java.util.Properties; 

public class Configuration { 
private Properties config = new Properties();// 记录配置项 
private String fn = null;// 记录配置文件名 


// 从指定文件名读入配置信息 
public Configuration() throws ConfigurationException { 
try { 
// FileInputStream fin = new FileInputStream(fileName); 
// is = classLoader.getResourceAsStream("common-config.properties"); 
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

// InputStream fin = null; 
// fin = classLoader.getResourceAsStream("system.conf"); 
URL URL = classLoader.getResource("system.conf"); 
fn = URL.getFile(); 
// FileOutputStream fout = new FileOutputStream(URL.getFile()); 
// config.load(fin); // 载入文件 
// fin.close(); 
} catch (Exception ex) { 
throw new ConfigurationException("无法读取指定的配置文件:" + fn); 



public void loadConfiguration() throws IOException, ConfigurationException{ 
try { 
FileInputStream fin = new FileInputStream(fn); 
config.load(fin); 
} catch (Exception e) { 
throw new ConfigurationException("无法读取指定的配置文件:" + fn); 


// 指定配置项名称,返回配置值 
public String getValue(String itemName)throws IOException, ConfigurationException{ 
loadConfiguration(); 
return config.getProperty(itemName); 


// 指定配置项名称和默认值,返回配置值 
public String getValue(String itemName, String defaultValue)throws IOException, ConfigurationException { 
loadConfiguration(); 
return config.getProperty(itemName, defaultValue); 


// 设置配置项名称及其值 
public void setValue(String itemName, String value) { 
config.setProperty(itemName, value); 
return; 


// 保存配置文件,指定文件名和抬头描述 
public void saveFile(String description) throws ConfigurationException { 
try { 
FileOutputStream fout = new FileOutputStream(fn); 
config.store(fout, description);// 保存文件 
fout.close(); 
} catch (IOException ex) { 
throw new ConfigurationException("无法保存指定的配置文件:" + fn); 



// 保存配置文件,指定文件名 
public void saveFile() throws ConfigurationException { 
if(fn.length()==0) throw new ConfigurationException("无法保存指定的配置文件:" + fn);; 
saveFile(""); 


}

已标记关键词 清除标记
相关推荐
JAVA开发人员必备是HTML格式的 JavaTM 2 Platform Standard Edition 6 API 规范 本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统都会遇到它,它提供了一种机制,能够在两个与 GUI 显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的各类事件的接口和类。 java.awt.font 提供与字体相关的类和接口。 java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt.print 为通用的打印 API 提供类和接口。 java.beans 包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。 java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象激活提供支持。 java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包的类和接口已经被 java.security 包的类取代。 java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页