java 操作Properties文件

来源:互联网 发布:秀智 知乎 编辑:程序博客网 时间:2024/05/02 04:35

Properties文件也就是属性文件,用来存放一些属性供程序读取。

这些属性由“=”左边的key和“=”右边的value构成,基本结构如下:

key=value

下面给出一个非常简单的Properties文件:

#Fri Jul 13 14:26:52 CST 2012
username=Jackpassword=123456age=18address=beijing

那么我们该如何操作.properties文件呢?在Java.util包下面有一个类叫Properties,提供了一些方法供我们使用。

Properties()构建一个无默认值的空属性列表

void load(InputStream in) 从指定的输入流中读取属性列表(键和元素对)

String getProperty(String key)用指定的键在此属性列表中搜索属性

Object setProperty(String key,String value) 将指定的key映射到指定的value

void store(OutputStream out,String comments)将Properties表中的属性列表写入输出流

好了,下面给出个简单的程序看看如何操作.properties文件

首先,根据指定的key值读取对应的value

复制代码
public static String readValue(String filePath, String key) {        Properties props = new Properties();        try {            InputStream in = new BufferedInputStream(new FileInputStream(filePath));            props.load(in);            String value = props.getProperty(key);            System.out.println(key + "=" + value);            return value;        } catch (Exception e) {            e.printStackTrace();            return null;        }    }
复制代码

另一种方法:

复制代码
import java.util.Locale;import java.util.ResourceBundle;public class ReadValue {    public static void main(String[] args) {        // TODO Auto-generated method stub        ResourceBundle rb=ResourceBundle.getBundle("app", Locale.CHINA);        System.out.println(rb.getString("keyname"));    }}
复制代码

 

读取全部的属性信息

复制代码
public static void readProperties(String filePath) {        Properties props = new Properties();        try {            InputStream in = new BufferedInputStream(new FileInputStream(                    filePath));            props.load(in);            Enumeration<?> en = props.propertyNames();            while (en.hasMoreElements()) {                String key = (String) en.nextElement();                String Property = props.getProperty(key);                System.out.println(key + "=" + Property);            }        } catch (Exception e) {            e.printStackTrace();        }    }
复制代码

向.properties文件中写入信息

复制代码
public static void writeProperties(String filePath, String parameterName,            String parameterValue) {        Properties prop = new Properties();        try {            InputStream fis = new FileInputStream(filePath);            prop.load(fis);            OutputStream fos = new FileOutputStream(filePath);            prop.setProperty(parameterName, parameterValue);            prop.store(fos, "Update '" + parameterName + "' value");        } catch (IOException e) {            e.printStackTrace();        }    }
复制代码

其中

prop.store(fos, "Update '" + parameterName + "' value");这句代码会在文件头添加一句描述信息:
#Update 'address' value#Fri Jul 13 15:02:27 CST 2012address=hainanage=18password=123456username=Jack

 

OK,本文到此结束,欢迎提出宝贵意见。


附:

在我们平时写程序的时候,有些参数是经常改变的,而这种改变不是我们预知的。比如说我们开发了一个操作数据库的模块,在开发的时候我们连接本地的数据库那么IP,数据库名称,表名称,数据库主机等信息是我们本地的,要使得这个操作数据的模块具有通用性,那么以上信息就不能写死在程序里。通常我们的做法是用配置文件来解决。

 

各种语言都有自己所支持的配置文件类型。比如Python,他支持.ini文件。因为他内部有一个ConfigParser类来支持.ini文件的读写,根据该类提供的方法程序员可以自由的来操作.ini文件。而在Java中,Java支持的是.properties文件的读写。JDK内置的java.util.Properties类为我们操作.properties文件提供了便利。

 

一..properties文件的形式

==========================================================

#以下为服务器、数据库信息

dbPort = localhost

databaseName = mydb

dbUserName = root

dbPassword = root

#以下为数据库表信息

dbTable = mytable

#以下为服务器信息

ip = 192.168.0.9

······

 

在上面的文件中我们假设该文件名为:test.properties文件。其中#开始的一行为注释信息;在等号“=”左边的我们称之为key;等号“=”右边的我们称之为value。(其实就是我们常说的键-值对)key应该是我们程序中的变量。而value是我们根据实际情况配置的。

 

二.JDK中的Properties

Properties类存在于胞Java.util中,该类继承自Hashtable,它提供了几个主要的方法:

1.getProperty(String key), 用指定的键在此属性列表中搜索属性。也就是通过参数key,得到key所对应的value。

2.load(InputStream inStream),从输入流中读取属性列表(键和元素对)。通过对指定的文件(比如说上面的test.properties文件)进行装载来获取该文件中的所有键-值对。以供getProperty(String key)来搜索。

3.setProperty(String key, String value),调用 Hashtable 的方法 put。他通过调用基类的put方法来设置键-值对。

4.store(OutputStream out, String comments), 以适合使用 load方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。与load方法相反,该方法将键-值对写入到指定的文件中去。

5.clear(),清除所有装载的键-值对。该方法在基类中提供。

有了以上几个方法我们就可以对.properties文件进行操作了!

 

三.代码实例

 

package configuration;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

/**
 * 
读取properties文件
 * 
@author Qutr
 *
 */

public class Configuration
{
    
private Properties propertie;
    
private FileInputStream inputFile;
    
private FileOutputStream outputFile;
    
    
/**
     * 
初始化Configuration
     */

    
public Configuration()
    
{
        propertie =
 new Properties();
    }
    
    
/**
     * 
初始化Configuration
     * 
@param filePath 要读取的配置文件的路径+名称
     */

    
public Configuration(String filePath)
    
{
        propertie =
 new Properties();
        
try {
            inputFile =
 new FileInputStream(filePath);
            propertie.load(inputFile);
            inputFile.close();
        }
 catch (FileNotFoundException ex) {
            System.out.println("
读取属性文件--->失败!原因:文件路径错误或者文件不存在");
            ex.printStackTrace();
        }
 catch (IOException ex) {
            System.out.println("
装载文件--->失败!");
            ex.printStackTrace();
        }
    }
//end ReadConfigInfo(...)
    
    
/**
     * 
重载函数,得到key的值
     * 
@param key 取得其值的键
     * 
@return key的值
     */

    
public String getValue(String key)
    
{
        
if(propertie.containsKey(key)){
            String value = propertie.getProperty(key);
//得到某一属性的值
            return value;
        }
        
else 
            
return "";
    }
//end getValue(...)
    
    
/**
     * 
重载函数,得到key的值
     * 
@param fileName properties文件的路径+文件名
     * 
@param key 取得其值的键
     * 
@return key的值
     */

    
public String getValue(String fileName, String key)
    
{
        
try {
            String value =
 "";
            inputFile =
 new FileInputStream(fileName);
            propertie.load(inputFile);
            inputFile.close();
            
if(propertie.containsKey(key)){
                value = propertie.getProperty(key);
                
return value;
            }
else
                
return value;
        }
 catch (FileNotFoundException e) {
            e.printStackTrace();
            
return "";
        }
 catch (IOException e) {
            e.printStackTrace();
            
return "";
        }
 catch (Exception ex) {
            ex.printStackTrace();
            
return "";
        }
    }
//end getValue(...)
    
    
/**
     * 
清除properties文件中所有的key和其值
     */

    
public void clear()
    
{
        propertie.clear();
    }
//end clear();
    
    
/**
     * 
改变或添加一个key的值,当key存在于properties文件中时该key的值被value所代替,
     * 
key不存在时,该key的值是value
     * 
@param key 要存入的键
     * 
@param value 要存入的值
     */

    
public void setValue(String key, String value)
    
{
        propertie.setProperty(key, value);
    }
//end setValue(...)
    
    
/**
     * 
将更改后的文件数据存入指定的文件中,该文件可以事先不存在。
     * 
@param fileName 文件路径+文件名称
     * 
@param description 对该文件的描述
     */

    
public void saveFile(String fileName, String description)
    
{
        
try {
            outputFile =
 new FileOutputStream(fileName);
            propertie.store(outputFile, description);
            outputFile.close();
        }
 catch (FileNotFoundException e) {
            e.printStackTrace();
        }
 catch (IOException ioe){
            ioe.printStackTrace();
        }
    }
//end saveFile(...)
    
    
public static void main(String[] args)
    
{
        Configuration rc =
 new Configuration("./config/test.properties");//相对路径
        
        String ip = rc.getValue("ipp");
//以下读取properties文件的值
        String host = rc.getValue("host");
        String tab = rc.getValue("tab");
        
        System.out.println("ip = "
 + ip + "ip-test leng = " + "ip-test".length());//以下输出properties读出的值
        System.out.println("ip's length = " + ip.length());
        System.out.println("host = "
 + host);
        System.out.println("tab = "
 + tab);

        Configuration cf =
 new Configuration();
        String ipp = cf.getValue("./config/test.properties", "ip");
        System.out.println("ipp = "
 + ipp);
//        cf.clear();
        cf.setValue("min", "999");
        cf.setValue("max", "1000");
        cf.saveFile("./config/save.perperties", "test");
        
//        Configuration saveCf = new Configuration();
//        saveCf.setValue("min", "10");
//        saveCf.setValue("max", "1000");
//        saveCf.saveFile("./config/save.perperties");
        
    }
//end main()
    
}
//end class ReadConfigInfo

四.小结

通过上面的例子不难看出,在Java中操作配置文件是非常简单的。在一个需要用到大量配置信息的模块或系统里,我们有必要封装一个专门的类来使用。通过最后的main函数调用,相信大家可以看出该类的用法。




原创粉丝点击