[转载收藏]使用JAVA读写Properties属性文件

来源:互联网 发布:win10输入法切换软件 编辑:程序博客网 时间:2024/06/18 10:55


Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件。它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必要使用数据库文件来保存,而使用一般的文本文件来保存,如果是通过File直接保存的话,可能在存储和读取上都不是很方便,但如果保存为Properties文件就不一样了,属性文件都有键值对应的,在JAVA的包中,有提供专门的操作属性文件的类。这个类就是 java.uitl.Properties类,由于Properties类是一个集合类,所以,Properties会将属性以集合的方式读写。

注意:下面的代码中对于抛出的异常都未采取捕获的方式,自己在编写程序的时候一定要注意捕获异常,推荐将捕获的异常处理掉。

Properties类继承字Hashtable类,采用键值对应的存储方式,在使用Properties类管理属性文件时有什么方便的呢?Properties类有专门的读写方法来读写Properties属性文件,不用担心读写的格式问题,只要为Properties类提供一个读写流即可。Properties用于读写属性文件的方法分别是:
  

Java代码
  1. //读取属性文件流的方法    
  2.    public void load(InputStream inStream) throws IOException {}    
  3.    //写属性文件流的方法   
  4.    public void store(OutputStream out, String comments) throws IOException {}   


首先,我们来看看如何从一个属性文件中读取属性。

假定我们已经新建了一个属性文件,名为prop.properties,内容如下:

  

Java代码
  1. sitename=abcjava    
  2.    siteurl=www.abcjava.com   



我们要做的第一步就是要将文件读取到Properties类对象中,由于load有一个参数是InputStream,所以我们可以用 InputStream的子类FileInputStream将属性文件读取到Properties对象中,知道prop.properties的路径,我们就用FileInputStream(String name)构造函数:

  

Java代码
  1. Properties prop = new Properties();//属性集合对象   
  2.    FileInputStream fis = new FileInputStream("prop.properties");//属性文件流   
  3.    prop.load(fis);//将属性文件流装载到Properties对象中   





接下来我们将做的事情就是如果读取一个属性,因为属性文件中的每一行都是一个键值对应,所以每一行都代表了一个属性对象,每一行都将以键和值的关系存储到Properties中,Properties类提供了getProperty(String key)方法用来通过键名读取键值,当key在属性集合中找不到时又想为key在程序中赋予一个值时可以使用public String getProperty(String key, String defaultValue)方法,这个方法的意思就是用指定的键在属性列表中搜索属性。如果在属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回默认值变量:

  

Java代码
  1. //获取属性值,sitename已在文件中定义   
  2.    System.out.println("获取属性值:sitename=" + prop.getProperty("sitename"));    
  3.    //获取属性值,country未在文件中定义,将在此程序中返回一个默认值,但并不修改属性文件   
  4.    System.out.println("获取属性值:country=" + prop.getProperty("country""中国"));   





在知道怎么读取属性文件之后我们还有一个很重要的事情就是要修改和添加新的属性到属性文件,这里就是使用public void store(OutputStream out, String comments)方法,这个方法是将属性集合写到一个OutputStream流中,同InputStream流一样,这里同样是使用其子类 FileOutputStream(String name),这里就不多说了。

在保存属性集合到文件之前,我们还有一件事情就是如何修改和添加新的属性到属性集合,这里使用了一个方法就是setProperty(String key, String value),这个方法就是当属性集合中存在指定的key时,就修改这个key的值,如果不存在,就新建一个key,同样是通过键值关系保存的,但值得注意的是,Properties类继承自Hashtable,所以也可以用Hashtable的put和putAll方法保存,但强烈反对使用这两个方法,因为它们允许调用方插入其键或值不是 Strings 的项。相反,应该使用 setProperty 方法。如果在“有危险”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。那好,下面我们就来看看修改、添加和保存属性的程序:

//修改sitename的属性值
prop.setProperty("sitename", "Boxcode");
//添加一个新的属性studio
prop.setProperty("studio", "Boxcode Studio");
//文件输出流
FileOutputStream fos = new FileOutputStream("prop.properties");
//将Properties集合保存到流中
prop.store(fos, "Copyright (c) Boxcode Studio");
fos.close();//关闭流



接下就是整个程序的源代码:

 

Java代码
  1. import java.io.FileInputStream;   
  2. import java.io.FileOutputStream;   
  3. import java.util.Properties;   
  4.   
  5. public class PropertyEditor {   
  6.     public static void main(String[] args) throws Exception {   
  7.         Properties prop = new Properties();// 属性集合对象  
  8.         FileInputStream fis = new FileInputStream("prop.properties");// 属性文件输入流  
  9.         prop.load(fis);// 将属性文件流装载到Properties对象中  
  10.         fis.close();// 关闭流  
  11.   
  12.         // 获取属性值,sitename已在文件中定义  
  13.         System.out.println("获取属性值:sitename=" + prop.getProperty("sitename"));   
  14.         // 获取属性值,country未在文件中定义,将在此程序中返回一个默认值,但并不修改属性文件  
  15.         System.out.println("获取属性值:country=" + prop.getProperty("country""中国"));   
  16.   
  17.         // 修改sitename的属性值  
  18.         prop.setProperty("sitename""Boxcode");   
  19.         // 添加一个新的属性studio  
  20.         prop.setProperty("studio""Boxcode Studio");   
  21.         // 文件输出流  
  22.         FileOutputStream fos = new FileOutputStream("prop.properties");   
  23.         // 将Properties集合保存到流中  
  24.         prop.store(fos, "Copyright (c) Boxcode Studio");   
  25.         fos.close();// 关闭流  
  26.     }   
  27. }  





在我们知道如何读写一个属性文件之后,我们仍然还有很多需要注意的问题,因为load和store方法都是按照ISO-8859-1的编码方式读写属性流文件的,而ILatin1 的字符和某些特殊字符,而对于非Latin1 的字符和某些特殊字符,则要使用与字符和字符串字面值所用的类似转义序列,以值和元素的形式来表示它们。所以当我们在处理中文时,不可以在直接修改属性文件时,将中文的值赋予给属性,而是要在JAVA程序中通过setProperty方法给属性赋予中文的值,因为这样store会将中文转换成 unicode码,在读取时系统会将读取到的unicode码按系统的编码打印出来,对于中文系统,通常是GBK码,这样中文才能够正常显示。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩挖耳朵疼了怎么办 挖耳朵挖破了怎么办 挖耳朵皮挖破了耳鸣怎么办 北京自考证丢啦怎么办 不服检察院的答复函该怎么办 检察院控申答复函不复怎么办 在看守所里疯了怎么办 第一次吸毒拘留五天第二次会怎么办 被派出所拘留15天怎么办 老公从拘留所出来聪明老婆怎么办 中信信用卡忘记还款了怎么办 监狱的犯人病了怎么办 判缓期间在行政拘留怎么办 法院拘留15天工作怎么办 高血压签定了无期限合同怎么办 法院司法拘留找不到人怎么办 c1骑摩托车要拘留怎么办 欠钱的找不到人怎么办 治安拘留人跑了怎么办 行政拘留拘留所不收应该怎么办 在看守所被打了怎么办 取保候审超过12个月怎么办 拘留20天还没有判刑怎么办 被打了没有证据怎么办 拘留37天后没有放人怎么办 强制执行执行的财产不够怎么办 收到公安局拘留通知家属应该怎么办 对方不出谅解书怎么办 寻衅滋事没抓的 怎么办 公务员政审父母拘留过怎么办 我参与了网赌怎么办 亲人出车祸去世家属怎么办 车牌换了原保险怎么办 北京车牌夫妻变更车险怎么办 赌博拘留15天不交罚款怎么办 给人打了不赔钱怎么办 打了人对方讹钱怎么办 换车了原来的etc怎么办 换异地车牌了etc怎么办 被执行人拘留15天后不还钱怎么办 被执行人拘留后还是不还钱怎么办