zoukankan      html  css  js  c++  java
  • 使用java.util.Properties类读写配置文件

    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")好奇,其实Systemjava.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方式加载就留给你做家庭作业吧。

    出处:http://www.zhaiqianfeng.com    
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    HDU 1160 dp中的路径问题
    zzuli 1907: 小火山的宝藏收益
    POJ 3414 dfs广搜直接应用
    http://acm.zzuli.edu.cn/zzuliacm/problem.php?cid=1158&pid=5 二分函数的间接应用
    LightOJ 1067 组合数取模
    九段美到极致的句子
    质数和分解
    codevs 1080 线段树练习
    codevs 2806 红与黑
    codevs 2152 滑雪
  • 原文地址:https://www.cnblogs.com/zhaiqianfeng/p/4620105.html
Copyright © 2011-2022 走看看