J2SE 1.5 以前的版本要求直接使用 XML 解析器来装载配置文件并存储设置,虽说也并非难事,相比 java.util.Properties却要做额外的解析工作。而java.util.Properties类提供了更实用的方法:loadFromXML(InputStream is)和load(InputStream is)。

如果不熟悉 java.util.Properties 类,那么可以简单告诉你它是用于键值对的操作,这正适合用于配置文件一类的操作。本文入门级地来简单介绍下java.util.Properties如何使用。

本文主要涉及到以下函数:

//加载/保存普通键值对文件
load(InputStream inStream)
store(OutputStream out, String comments)
//加载/保存XML键值对文件
loadFromXML(InputStream in)
storeToXML(OutputStream os, String comment)
//获取/设置键的值
getProperty(String key)
setProperty(String key, String value)
//列出所有的键值对
list(PrintStream out)

本文的项目结构如下:

demo.properties和out.properties的内容都是:

#comments
website=oseye.net
username=oseye

使用普通方式加载

普通的方式文件一般以properties作为后缀如"demo.properties",我们读的代码如下:

package net.oseye;

import java.util.Properties;

public class RunMain {

	public static void main(String[] args) throws Exception {
Properties prop=new Properties();
prop.load(RunMain.class.getResourceAsStream("/config/demo.properties"));
prop.list(System.out);
System.out.println("website的值:"+prop.getProperty("website"));
prop.setProperty("username", "开源视窗");
System.out.println("username的值:"+prop.getProperty("username")); }
}

输出:

-- listing properties --
website=oseye.net
username=oseye
website的值:oseye.net
username的值:开源视窗

RunMain.class.getResourceAsStream("/config/demo.properties")

中的原型是:

public InputStream getResourceAsStream(String name)

查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的,因此你只能用它来加载classpath中的。所以当我们把项目打成一个JAR包时(如何打包请看这里),它加载的配置文件一般也是被打到JAR包里了。而这样就造成配置文件不方便后期更改,所以我们一般不会把配置文件放到JAR包,那就不能用class loader的方式了,因为你会找不到配置文件的。这里有个路径问题,要注意!我弄了很久才搞明白。

如果使用out.properties的代码是怎么样的呢?

package net.oseye;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties; public class RunMain { public static void main(String[] args) throws Exception {
Properties prop=new Properties();
FileInputStream fis=new FileInputStream(
System.getProperty("user.dir")+File.separator+"config"+File.separator+"out.properties");
prop.load(fis);
fis.close();
prop.list(System.out);
System.out.println("website的值:"+prop.getProperty("website"));
prop.setProperty("username", "开源视窗");
System.out.println("username的值:"+prop.getProperty("username")); }
}

这样只要在与导出的JAR同一级目录中有config/out.properties就可以,达到包和配置文件分离的目的。

使用XML方式加载

如果我们对读取out.properties的程序稍加修改,把配置文件保存到XML:

package net.oseye;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties; public class RunMain { public static void main(String[] args) throws Exception {
Properties prop=new Properties();
FileInputStream fis=new FileInputStream(
System.getProperty("user.dir")+File.separator+"config"+File.separator+"out.properties");
prop.load(fis);
fis.close();
prop.list(System.out);
FileOutputStream fos=new FileOutputStream(
System.getProperty("user.dir")+File.separator+"config"+File.separator+"out.xml");
prop.storeToXML(fos, "XML");
fos.close(); }
}

就会在与out.properties同级的目录下生成一个out.xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>XML</comment>
<entry key="website">oseye.net</entry>
<entry key="username">oseye</entry>
</properties>

可以看到out.xml的root是<properties>,包含了一个注释类型的 <comment> 标签以及多个 <entry> 标签.每个 <entry> 标签就是键值对组成的。

有同学可能会对 System.getProperty("user.dir")好奇,其实System是java.lang下的一个类,通过getProperty可以获取很多系统属性:

java.version Java 运行时环境版本
java.vendor Java 运行时环境供应商
java.vendor.url Java 供应商的 URL
java.home Java 安装目录
java.vm.specification.version Java 虚拟机规范版本
java.vm.specification.vendor Java 虚拟机规范供应商
java.vm.specification.name Java 虚拟机规范名称
java.vm.version Java 虚拟机实现版本
java.vm.vendor Java 虚拟机实现供应商
java.vm.name Java 虚拟机实现名称
java.specification.version Java 运行时环境规范版本
java.specification.vendor Java 运行时环境规范供应商
java.specification.name Java 运行时环境规范名称
java.class.version Java 类格式版本号
java.class.path Java 类路径
java.library.path 加载库时搜索的路径列表
java.io.tmpdir 默认的临时文件路径
java.compiler 要使用的 JIT 编译器的名称
java.ext.dirs 一个或多个扩展目录的路径
os.name 操作系统的名称
os.arch 操作系统的架构
os.version 操作系统的版本
file.separator 文件分隔符(在 UNIX 系统中是“/”)
path.separator 路径分隔符(在 UNIX 系统中是“:”)
line.separator 行分隔符(在 UNIX 系统中是“/n”)
user.name 用户的账户名称
user.home 用户的主目录
user.dir 用户的当前工作目录

好了,就到这里了,至于如何以XML方式加载就留给你做家庭作业吧。

使用java.util.Properties类读写配置文件的更多相关文章

  1. java.util.Properties类 学习笔记

    学习目标:   1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 3.掌握相对路 ...

  2. java.util.Properties类,保存时保留注释及格式不变

    原文地址:http://blog.csdn.net/benbenxiongyuan/article/details/53006097 参考地址:http://www.iteye.com/topic/1 ...

  3. java.util.Properties类的介绍-配置文件的读写【-Z-】

    简介:java.util.Properties是对properties这类配置文件的映射.支持key-value类型和xml类型两种. #打头的是注释行,Properties会忽略注释.允许只有key ...

  4. 【Java笔记】配置文件java.util.Properties类的使用

    配置文件的路径:项目名/src/main/resources/mmall.properties mmall.properties的内容是键值对.例如假设写了ftp服务器的一些信息. ftp.serve ...

  5. 方便好使的java.util.Properties类

    今天偶然碰到这个类,发现jdk中这些平时不大用到的类还挺好玩儿的,用起来也特别实在方便,随便写点记录下. java.util.Properties是对properties这类配置文件的映射.支持key ...

  6. java.util.Properties类

    http://trans.blog.51cto.com/503170/110227/ http://soft.chinabyte.com/database/395/12625895.shtml

  7. 通过java.util.Properties类来读取.properties文件中key对应的value

    转:http://www.cnblogs.com/panjun-Donet/archive/2009/07/17/1525597.html

  8. Java中Properties类

    1 简介: JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,用map来存储key-value数据,所以存入的数据是无序的.其中键和值都是字符串类型 ...

  9. Java中Properties类的学习总结

    学习目标: 1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 一.认识prope ...

随机推荐

  1. JUC学习笔记--JUC中并发工具类

    JUC中并发工具类 CountDownLatch CountDownLatch是我目前使用比较多的类,CountDownLatch初始化时会给定一个计数,然后每次调用countDown() 计数减1, ...

  2. Ajax+存储过程真分页实例解析(10W数据毫秒级+项目解析)

    周末闲来无事,突然想写个分页的东西玩玩,说走就走 在文章最后我会把整个项目+数据库附上,下载下来直接运行就可以看效果了.整个项目采用的是简单三层模式,开发平开是VS2010+SQL2012 一.我要做 ...

  3. Struct 和 Union 的详细区别

    Union: 共用体 Struct:结构体 两者的区别: 1:共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放一个被选中的成员, 而结构体则存放所有的成员变量. 2: ...

  4. [工作总结] QA小鸟一年了

    夏至又至,在北京360的一年过去了.作为一名QA,我时常感到迷惑,如何靠大部分的手工测试+少部分的自动化测试来保证产品功能的质量.对于开发完成后,给到我手上的文件和功能说明,我很少有信心说能够通过自己 ...

  5. [html]关于html标签的一些总结

    以下内容纯属个人对项目细节的总结,因为只是为了自己回顾方便,所以比较杂乱. 1.img 如果不指定img的高度和宽度,则img显示的是原图片的大小:如果只指定了高度和宽度中的一者,则为指定的一者等比例 ...

  6. We Chall-Training: Encodings I -Writeup

    MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...

  7. Linux如何创建一个进程

    关于准备知识: 每个进程都有以下属性: 1  地址空间 每个进程都有自己的进程地址空间,格式大概是这个样子: 栈(Stack)以帧为单位,当程序调用函数(假如该函数名为fun01)时,stack会向下 ...

  8. js在新页面中返回到上一页浏览的历史位置

    在微信浏览器中浏览页面时,在当前页面中当我们将页面往下滚动到某一个位置时,可能我们就会点击某个链接而页面跳转到了另外一个页面,而当我们又返回到上一个页面时我们会发现那个页面还停留在我们之前浏览的位置, ...

  9. 11g默认审计选项

    [注:参考了maclean的网文]11g默认审计选项AUDIT_TRAIL参数的缺省值为DB,审计数据记录在数据库中的AUD$审计字典基表上.在11g中CREATE SESSION将被作为受审计的权限 ...

  10. OC 常用方法记录

    1.排序 给数组排序 按照字母的升序 //对key按字母升序排序 NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparis ...