Java中读写资源文件最重要的类是Properties
1) 资源文件要求如下:
1、properties文件是一个文本文件
2、properties文件的语法有两种,一种是注释,一种属性配置。
注 释:前面加上#号
属性配置:以“键=值”的方式书写一个属性的配置信息。
3、properties文件的一个属性配置信息值可以换行,但键不可以换行。值换行用“\”表示。
4、properties的属性配置键值前后的空格在解析时候会被忽略。
5、properties文件可以只有键而没有值。也可以仅有键和等号而没有值,但无论如何一个属性配置不能没有键。
eg:
正确的资源文件格式为:
2) 功能大致如下:
1. 读写Properties文件
2. 读写XML文件
3. 不仅可以读写上述两类文件,还可以读写其它格式文件如txt等,只要符合key=value格式即可.
Properties能读取以key,value存储的任何格式文件,看一下他的类结构就知道为什么了
从上面的类结构图可以看出,它继承了Hashtable并实现了Map接口
3)代码演示:
1 package com.ifly.myhome.test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.OutputStream; 9 import java.io.UnsupportedEncodingException; 10 import java.util.Properties; 11 12 public class PropertiesMyTest 13 { 14 15 public static void main(String[] args) 16 { 17 18 String readfile = "e:" + File.separator + "readfile.properties"; 19 String writefile = "e:" + File.separator + "writefile.properties"; 20 String readxmlfile = "e:" + File.separator + "readxmlfile.xml"; 21 String writexmlfile = "e:" + File.separator + "writexmlfile.xml"; 22 String readtxtfile = "e:" + File.separator + "readtxtfile.txt"; 23 String writetxtfile = "e:" + File.separator + "writetxtfile.txt"; 24 25 readPropertiesFile(readfile); //读取properties文件 26 writePropertiesFile(writefile); //写properties文件 27 readPropertiesFileFromXML(readxmlfile); //读取XML文件 28 writePropertiesFileToXML(writexmlfile); //写XML文件 29 readPropertiesFile(readtxtfile); //读取txt文件 30 writePropertiesFile(writetxtfile); //写txt文件 31 } 32 33 //读取资源文件,并处理中文乱码 34 public static void readPropertiesFile(String filename) 35 { 36 Properties properties = new Properties(); 37 try 38 { 39 InputStream inputStream = new FileInputStream(filename); 40 properties.load(inputStream); 41 inputStream.close(); //关闭流 42 } 43 catch (IOException e) 44 { 45 e.printStackTrace(); 46 } 47 String username = properties.getProperty("username"); 48 String passsword = properties.getProperty("password"); 49 String chinese = properties.getProperty("chinese"); 50 try 51 { 52 chinese = new String(chinese.getBytes("ISO-8859-1"), "GBK"); // 处理中文乱码 53 } 54 catch (UnsupportedEncodingException e) 55 { 56 e.printStackTrace(); 57 } 58 System.out.println(username); 59 System.out.println(passsword); 60 System.out.println(chinese); 61 } 62 63 //读取XML文件,并处理中文乱码 64 public static void readPropertiesFileFromXML(String filename) 65 { 66 Properties properties = new Properties(); 67 try 68 { 69 InputStream inputStream = new FileInputStream(filename); 70 properties.loadFromXML(inputStream); 71 inputStream.close(); 72 } 73 catch (IOException e) 74 { 75 e.printStackTrace(); 76 } 77 String username = properties.getProperty("username"); 78 String passsword = properties.getProperty("password"); 79 String chinese = properties.getProperty("chinese"); //XML中的中文不用处理乱码,正常显示 80 System.out.println(username); 81 System.out.println(passsword); 82 System.out.println(chinese); 83 } 84 85 //写资源文件,含中文 86 public static void writePropertiesFile(String filename) 87 { 88 Properties properties = new Properties(); 89 try 90 { 91 OutputStream outputStream = new FileOutputStream(filename); 92 properties.setProperty("username", "myname"); 93 properties.setProperty("password", "mypassword"); 94 properties.setProperty("chinese", "中文"); 95 properties.store(outputStream, "author: shixing_11@sina.com"); 96 outputStream.close(); 97 } 98 catch (IOException e) 99 { 100 e.printStackTrace(); 101 } 102 } 103 104 //写资源文件到XML文件,含中文 105 public static void writePropertiesFileToXML(String filename) 106 { 107 Properties properties = new Properties(); 108 try 109 { 110 OutputStream outputStream = new FileOutputStream(filename); 111 properties.setProperty("username", "myname"); 112 properties.setProperty("password", "mypassword"); 113 properties.setProperty("chinese", "中文"); 114 properties.storeToXML(outputStream, "author: shixing_11@sina.com"); 115 outputStream.close(); 116 } 117 catch (IOException e) 118 { 119 e.printStackTrace(); 120 } 121 } 122 123 }
运行本程序所需的资源文件,我是放在E盘根目录,如E:/readfile.properties
1. readfile.properties
username=khpassword=khchinese=谓语
2. writefile.properties
#author: shixing_11@sina.com#Fri May 28 22:19:44 CST 2010password=khchinese=\u8C13\u8BEDusername=kh
3. readxmlfile.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties><entry key="password">mypassword</entry><entry key="chinese">中文</entry><entry key="username">myname</entry></properties>
4. writexmlfile.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties><entry key="password">kh</entry><entry key="chinese">中文</entry><entry key="username">kh</entry></properties>
5. readtxtfile.txt
username=kh
password=kh
chinese=中文
6. writetxtfile.txt
password=kh
chinese=/u4E2D/u6587
username=kh
4)Properties获取数据乱码解决
1.原因
Properties调用load(InputStream)时,读取文件时使用的默认编码为ISO-8859-1;当我们讲中文放入到properties文件中,通过getProperty(key)获取值时,取到得数据是ISO-8859-1格式的,但是ISO-8859-1是不能识别中文的。
2.解决方法
通过getProperty()获取的数据data既然是ISO-8859-1编码的,就通过data.getByte(“iso-8859-1”)获取获取,使用new String(data.getByte(“iso-8859-1”),”UTF-8”)进行转换。当然properties文件的编码类型需要和new String(Byte[],charst)中的第二个参数的编码类型相同