下面的文章来自CSDN hyde82的专栏,因为很实用,所以就摘下来放在此处,具体网址忘记啦.
无论是有图形化的选项配置对话框,或者是系统提供的注册表,文本形式的本地配置文件依然是最牢靠、应用最广泛的配置信息保存形式。配置信息的一般模式就是一个配置项对应一个值,前者一般是个字符串,后者可能是数字或者字符串或者别的什么。在传统win32编程中有系统提供的api供我们解读.ini文件,后来也有操作注册表的封装好的api,在.net中更是有解读XML形式.config文件的现成方法。在Java中,对配置文件的使用进行封装也是十分有意义的。
封装应该达到这样的效果:应用只管从配置信息进行按名读取值、设置值、保存等操作,而不需要关心具体以什么文件格式保存、如何解析。文件格式(纯文本?XML?数据库?)、IO方式(本地文件?远程文件?控制台流?)在封装类内部的变更,都不会影响应用对配置信息的感知。
从键名-值的对应关系以及文件的存取,我们最容易想到的就是java.util.Properties对象,他是HashTable的子类,保存的就是很多组键名-值的对应二原组,并提供快速的查询和直接的从文件读取、保存为文件的方法。具体请参考相关文档,我们直接看程序。
首先自定义一个异常:
//ConfigurationException.java
package configuration;
public class ConfigurationException extends Exception{
public ConfigurationException(){}
public ConfigurationException(String msg){
super(msg);
}
}
然后是我们的封装类:
//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编程中,属性文件(通常以`.properties`为扩展名)是一种常见的配置文件类型,用于存储应用程序的配置参数和设置。这些文件以键值对的形式组织,键和值之间用等号`=`或冒号`:`分隔。在本教程中,我们将深入...
在Java编程语言中,XML(eXtensible Markup Language)是一种重要的数据交换格式,用于存储和...在提供的"在java中读写XML文件.ppt"和"源码"中,可能包含了更多详细的步骤和示例代码,可以帮助你进一步理解这个主题。
在Java编程中,随机读写Java类文件是一个高级主题,涉及到对字节码级别的操作,通常用于类的动态加载、代码注入或者逆向工程等场景。以下是对这一主题的详细阐述: 1. **Java类文件结构**:首先,了解Java类文件的...
如果需要读取配置文件中的所有键值对,可以使用`propertyNames`方法获取所有键名,并通过`getProperty`方法逐一读取每个键对应的值。 ```java public static void readProperties(String filePath) { ...
它涉及到如何访问和处理磁盘上的文件,包括读取文本文件、二进制文件,以及写入新的数据到文件中。在这个场景中,我们关注的是“java文件读写”,特别是读取`properties`配置文件和处理目录及文件的操作。下面我们将...
标题提及的“java读写hdf5格式文件需要使用的库”主要包括两个部分:Java接口库和操作系统特定的动态链接库。这里提供的jar文件`hdf5-3.3.2.jar`是Java接口库,它封装了对HDF5文件的操作,使得Java程序员可以通过...
在读写属性文件时,可能会遇到文件找不到、权限不足等问题。为了确保程序的健壮性,应使用`try-catch`块处理异常,如`FileNotFoundException`和`IOException`。 6. **在项目中的应用** 从提供的文件列表看,`User...
* 得到属性文件的值 */ public String getValueByPropertyKey(String key) { String value = null; if (checkPropertyFile()) { value = getValue(key); } return value; } /* * get Value ...
在Java中读写Excel文件是一项常见的任务,尤其是在数据处理和报表生成的场景中。Apache Jakarta POI项目为Java开发者提供了一套强大的工具,允许他们直接操作Microsoft Office格式的文件,包括Excel。POI库分为多个...
在Java编程语言中,读写文件是常见的操作,它涉及到对磁盘上文件内容的访问。这个"java简单的读写文件小程序"很可能是用来演示如何使用Java API进行文件操作的基本概念。下面,我们将深入探讨Java中读取和写入文件的...
在Java编程中,读写文本文件(如`.txt`文件)是常见的操作,尤其是在处理配置文件时。配置文件通常以键值对(key-value pairs)的形式存储数据,便于程序访问和管理设置。以下是对这个主题的详细阐述: 1. **Java I...
- `HSSFWorkbook`:代表Excel文件中的工作簿(Book),是创建和操作Excel文件的核心类。 - `HSSFSheet`:表示工作簿中的工作表(Sheet)。 - `HSSFRow`:代表工作表中的一行。 - `HSSFCell`:表示单元格,可以...
自定义类可以封装`Properties`对象,并提供更方便的方法来读写属性文件。 8. **使用流和资源管理** 为了遵循Java的“try-with-resources”语句,可以使用`try`块自动关闭输入/输出流: ```java try ...
在写入 JSON 文件时,可以使用文件输出流来写入文件内容,例如,public void writeElectSet(ElectSet electSet, String path) 方法可以将 ElectSet 对象转换成 JSON 字符串,然后将其写入到文件中。 本文详细讲解了...
在这个程序中,我们关注的是如何使用Java的IO流(Input/Output Stream)来读取多个TXT文件的内容,并将其合并到一个新的TXT文件中。以下是关于这个程序及其涉及的Java IO流知识点的详细解释: 1. **IO流概念**:...
本指南将深入探讨Java中的文件读写API,包括常用的方法、性能分析以及不同方式之间的对比。以下是对相关知识点的详细说明: 1. **File类**: Java中的`java.io.File`类是文件和目录路径名的抽象表示形式。它提供了...
这段代码首先设置了一个键值对,然后创建一个FileOutputStream对象指向要写入的文件,调用`store()`方法保存Properties对象的内容到文件中。 ### 键值对的操作 除了`getProperty()`和`setProperty()`方法,...
在描述中提到的博客文章“一次代码重构之旅-快速读写xml文件工具类封装”,作者分享了如何通过Java进行XML操作的优化,将原始的XML处理代码整合到一个工具类中,提供简洁易用的API。在阅读该博客文章的过程中,我们...
### Java读写文件详解 #### 文件的建立、检查与删除 在Java中,对文件进行基本的操作主要包括创建、检查以及删除。以下通过示例代码详细解释这些操作。 **创建文件** 利用`java.io.File`类可以创建一个新的文件...
在提供的"TestXML"文件中,可能包含一个或多个示例,演示了如何使用Java进行XML的读写操作。这些示例可能包括创建`Document`对象,添加元素,修改元素,以及将DOM树写回XML文件的代码。通过分析和运行这些示例,可以...