`
j357777842
  • 浏览: 69140 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论
  • letle: 这种隐藏贴还是不要发的好
    Array类
  • ajaxgo: lz,我建议你这类纯api的东西,可以找份js api手册藏着 ...
    Array类
  • zxyyxzzxy: 不错。学到了不少东西!
    Array类
  • ajaxgo: lz是要告诉我们函数的知识,还是在问问题??话说上面那段见的眼 ...
    Function
  • afcn0: 当然不一样,函数的length在js里面是一个比较没用的东西, ...
    Function

java中读写属性文件

    博客分类:
  • java
阅读更多
下面的文章来自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读取属性文件

    在Java编程中,属性文件(通常以`.properties`为扩展名)是一种常见的配置文件类型,用于存储应用程序的配置参数和设置。这些文件以键值对的形式组织,键和值之间用等号`=`或冒号`:`分隔。在本教程中,我们将深入...

    java中读写XML文件

    在Java编程语言中,XML(eXtensible Markup Language)是一种重要的数据交换格式,用于存储和...在提供的"在java中读写XML文件.ppt"和"源码"中,可能包含了更多详细的步骤和示例代码,可以帮助你进一步理解这个主题。

    java 随机读写Java类文件

    在Java编程中,随机读写Java类文件是一个高级主题,涉及到对字节码级别的操作,通常用于类的动态加载、代码注入或者逆向工程等场景。以下是对这一主题的详细阐述: 1. **Java类文件结构**:首先,了解Java类文件的...

    java读写properties配置文件

    如果需要读取配置文件中的所有键值对,可以使用`propertyNames`方法获取所有键名,并通过`getProperty`方法逐一读取每个键对应的值。 ```java public static void readProperties(String filePath) { ...

    java 文件读写

    它涉及到如何访问和处理磁盘上的文件,包括读取文本文件、二进制文件,以及写入新的数据到文件中。在这个场景中,我们关注的是“java文件读写”,特别是读取`properties`配置文件和处理目录及文件的操作。下面我们将...

    java读写hdf5格式文件需要使用的库

    标题提及的“java读写hdf5格式文件需要使用的库”主要包括两个部分:Java接口库和操作系统特定的动态链接库。这里提供的jar文件`hdf5-3.3.2.jar`是Java接口库,它封装了对HDF5文件的操作,使得Java程序员可以通过...

    属性文件的读写

    在读写属性文件时,可能会遇到文件找不到、权限不足等问题。为了确保程序的健壮性,应使用`try-catch`块处理异常,如`FileNotFoundException`和`IOException`。 6. **在项目中的应用** 从提供的文件列表看,`User...

    属性文件读写(java)

    * 得到属性文件的值 */ public String getValueByPropertyKey(String key) { String value = null; if (checkPropertyFile()) { value = getValue(key); } return value; } /* * get Value ...

    在Java中读写Excel文件.docx

    在Java中读写Excel文件是一项常见的任务,尤其是在数据处理和报表生成的场景中。Apache Jakarta POI项目为Java开发者提供了一套强大的工具,允许他们直接操作Microsoft Office格式的文件,包括Excel。POI库分为多个...

    java简单的读写文件小程序

    在Java编程语言中,读写文件是常见的操作,它涉及到对磁盘上文件内容的访问。这个"java简单的读写文件小程序"很可能是用来演示如何使用Java API进行文件操作的基本概念。下面,我们将深入探讨Java中读取和写入文件的...

    Java读写.txt文件

    在Java编程中,读写文本文件(如`.txt`文件)是常见的操作,尤其是在处理配置文件时。配置文件通常以键值对(key-value pairs)的形式存储数据,便于程序访问和管理设置。以下是对这个主题的详细阐述: 1. **Java I...

    在Java中读写Excel文件.pdf

    - `HSSFWorkbook`:代表Excel文件中的工作簿(Book),是创建和操作Excel文件的核心类。 - `HSSFSheet`:表示工作簿中的工作表(Sheet)。 - `HSSFRow`:代表工作表中的一行。 - `HSSFCell`:表示单元格,可以...

    属性文件读写操作类

    自定义类可以封装`Properties`对象,并提供更方便的方法来读写属性文件。 8. **使用流和资源管理** 为了遵循Java的“try-with-resources”语句,可以使用`try`块自动关闭输入/输出流: ```java try ...

    Java_读写json格式的文件方法详解

    在写入 JSON 文件时,可以使用文件输出流来写入文件内容,例如,public void writeElectSet(ElectSet electSet, String path) 方法可以将 ElectSet 对象转换成 JSON 字符串,然后将其写入到文件中。 本文详细讲解了...

    JAVA 操作文件,读写。

    在这个程序中,我们关注的是如何使用Java的IO流(Input/Output Stream)来读取多个TXT文件的内容,并将其合并到一个新的TXT文件中。以下是关于这个程序及其涉及的Java IO流知识点的详细解释: 1. **IO流概念**:...

    Java读写文件API的用法指南,性能分析与对比。

    本指南将深入探讨Java中的文件读写API,包括常用的方法、性能分析以及不同方式之间的对比。以下是对相关知识点的详细说明: 1. **File类**: Java中的`java.io.File`类是文件和目录路径名的抽象表示形式。它提供了...

    Java源码读写Properties文件.rar

    这段代码首先设置了一个键值对,然后创建一个FileOutputStream对象指向要写入的文件,调用`store()`方法保存Properties对象的内容到文件中。 ### 键值对的操作 除了`getProperty()`和`setProperty()`方法,...

    一次代码重构之旅-快速读写xml文件工具类封装

    在描述中提到的博客文章“一次代码重构之旅-快速读写xml文件工具类封装”,作者分享了如何通过Java进行XML操作的优化,将原始的XML处理代码整合到一个工具类中,提供简洁易用的API。在阅读该博客文章的过程中,我们...

    java读写文件,Java操作文件

    ### Java读写文件详解 #### 文件的建立、检查与删除 在Java中,对文件进行基本的操作主要包括创建、检查以及删除。以下通过示例代码详细解释这些操作。 **创建文件** 利用`java.io.File`类可以创建一个新的文件...

    java读写xml文件

    在提供的"TestXML"文件中,可能包含一个或多个示例,演示了如何使用Java进行XML的读写操作。这些示例可能包括创建`Document`对象,添加元素,修改元素,以及将DOM树写回XML文件的代码。通过分析和运行这些示例,可以...

Global site tag (gtag.js) - Google Analytics