【Java】配置文件概念,Java对配置文件的操作
*.ini、*.properties、*.xml都是配置文件,这些配置文件往往被奉若神明,自从我们接触电脑的那一天开始,就被人警告不要乱弄他们。其实他们与java的HashMap结构是一样的,都是一个存放key-value对的容器,只是配置文件那些是属性与属性值的key-value对罢了,HashMap不懂是啥的同志可以参考我之前写的《【Java】Java中的Collections类——Java中
*.ini、*.properties、*.xml都是配置文件,这些配置文件往往被奉若神明,自从我们接触电脑的那一天开始,就被人警告不要乱弄他们。其实他们与java的HashMap结构是一样的,都是一个存放key-value对的容器,只是配置文件那些是属性与属性值的key-value对罢了,HashMap不懂是啥的同志可以参考我之前写的《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接),但是为何不能乱碰它呢?因为这些key-valueyi对一般是记录着程序运行的参数,而且很多是初始化的参数,一般这些参数都是自程序的开始运行,也就是程序的出生到程序被关闭,也就是程序死亡都需要使用的定值。正如我们每一个人的名字、性别、出生地这些属性一样,从我们出生到死亡都要不停地用。
配置文件主要有三种后缀名,在Windows系统中是*.ini,*.ini在很多win32程序大家都见过了,这东西还被贴上“系统文件”的标签,删除或者什么的会被Windows警告,其实它只不过是配置文件似的,阅读完本文之后,你就会觉得配置文件就是那回事。配置文件在Linux系统或者在一些Java工程中的是则是*.properties,最常见的就是现在很火的SSH的国际化文件,就是以配置文件为国际化的发起点的。
其实*.ini与*.properties是完全一样的东西,正如*.dll与*.jar的对应关系一样,都是win32程序或者java程序必要的运行库。*.dll没有写过大型win32程序的人可能不熟悉,但是*.jar大家肯定知道,很多java程序的编写必须放进一些*.jar包使得开发更加便捷,然后你的java工程运行必须带着这些*.jar包才能运行。大家也可以观察到大部分win32程序在目录下都存在*.dll,那是因为这些win32在编写时候就用到这些*.dll包啊!相当与java的插件。
此外还有一种新型的配置文件.xml,这东西相信大家也不陌生,在Jsp工程的总配置文件web.xml你弄不好,就别想启动工程。为什么说*.xml是新型的配置文件,还有一些*.xml是新时代的产物的观点呢?那是因为*.ini,*.properties是不支持中文的,而*.xml是支持中文的。
在Java中操作配置文件非常简单,正如操作一个HashMap一样简单,配置文件类Properties同样在java.util.*包里面,同时涉及文件的读写操作,所以同样需要java.io.*,对于Java输入输出不了解的读者,可以参考我之前写的《【Java】输入与输出与JDK1.5之后的新型字符串StringBuilder》(点击打开链接)。见如下的程序:
import java.io.*;
import java.util.*;
public class propertiesTest {
public static void main(String[] args) throws IOException {
// 同样先初始化Properties类
// 初始化之后在内存就出现一个保存key-value对的properties对象
Properties properties = new Properties();
// 之后设置三个属性,可以与HashMap的put方法做类比,同样是在操作key-value对
// 故意设置一个中文的value来说明*.ini,*.properties与*.xml之间对中文的支持
properties.setProperty("username", "aaa");
properties.setProperty("chinese", "中文");
properties.setProperty("password", "123");
// 此时,内存中的properties对象便有三个key-value对
// 利用store方法与storeToXML方法把内存中的properties对象记录的属性保存到磁盘中的配置文件
// 方法仅支持文件输出流对象,单单一个文件对象File是行不通的
// 第二个参数是此配置文件的注释
properties.store(new FileOutputStream("c:\\a.ini"), "中文");
properties.store(new FileOutputStream("c:\\a.properties"), "comment");
properties.storeToXML(new FileOutputStream("c:\\a.xml"), "注释");
// 清空properties对象
properties = new Properties();
// 再把c:\a.ini里面存放的属性读取进来
properties.load(new FileInputStream("c:\\a.ini"));
// 修改password属性的值变成456
properties.put("password", "456");
// 打印此时内存中的properties对象
System.out.println(properties);
// 如下方法,可以取得内存中的properties对象中的username的属性值
System.out.println(properties.getProperty("username"));
// 再清空properties对象,读取c:\a.xml配置文件所存储的属性,注意读*.xml方法是不同
properties = new Properties();
properties.loadFromXML(new FileInputStream("c:\\a.xml"));
// 打印内存中的属性
System.out.println(properties);
}
}
程序运行之后,在控制台会输出如下东西:
在C盘会得到三个配置文件a.ini,au.properties与a.xml,
a.ini与a.properties的内容除注释之外,其余部分都是一样的,以下是a.ini的内容,
可以看到,这个a.ini这种旧式的配置文件根本就不支持中文,Java中Properties类的store方法只能把中文帮你转码保存,注意与运行结果比对,load方法并不读取注释,使用load把这些属性读回来程序之后无需转码就显示正常。因此struts国际化的时候可以利用Properties类去转码与输出,根本就不用用到什么工具,Java本来就有相应的方法。作为程序的配置文件一般是保存重要的信息的,并不需要给用户看的,因此,属性值一般只是一些数字之类的。
而a.xml的内容则非常丰富,具体如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>注释</comment>
<entry key="password">123</entry>
<entry key="chinese">中文</entry>
<entry key="username">aaa</entry>
</properties>
但Properties对象的loadFromXML方法的读取仅仅是读取其中的key-value的程序对,对比运行结果,
你可以看到,都是以属性与属性值的key-value对来读取的。
通过上面对配置文件概念的解释与Java对配置文件的操作,估计大家已经基本掌握*.ini、*.properties、*.xml这些配置文件到底是啥,也可以看到这些配置文件的基本结构了。
更多推荐
所有评论(0)