我们通常会将Java应用的配置参数保存在属性文件中,Java应用的属性文件可以是一个正常的基于key-value对,以properties为扩展名的文件,也可以是XML文件.

在本案例中,將会向大家介绍如何通过Java程序输出这两种格式的属性文件,并介绍如何从classpath中加载和使用这两种属性文件。

下面是案例程序代码:

PropertyFilesUtil.java

package com.journaldev.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Set; public class PropertyFilesUtil { public static void main(String[] args) throws IOException {
String propertyFileName = "DB.properties";
String xmlFileName = "DB.xml";
writePropertyFile(propertyFileName, xmlFileName);
readPropertyFile(propertyFileName, xmlFileName);
readAllKeys(propertyFileName, xmlFileName);
readPropertyFileFromClasspath(propertyFileName);
} /**
* read property file from classpath
* @param propertyFileName
* @throws IOException
*/
private static void readPropertyFileFromClasspath(String propertyFileName) throws IOException {
Properties prop = new Properties();
prop.load(PropertyFilesUtil.class.getClassLoader().getResourceAsStream(propertyFileName));
System.out.println(propertyFileName +" loaded from Classpath::db.host = "+prop.getProperty("db.host"));
System.out.println(propertyFileName +" loaded from Classpath::db.user = "+prop.getProperty("db.user"));
System.out.println(propertyFileName +" loaded from Classpath::db.pwd = "+prop.getProperty("db.pwd"));
System.out.println(propertyFileName +" loaded from Classpath::XYZ = "+prop.getProperty("XYZ")); } /**
* read all the keys from the given property files
* @param propertyFileName
* @param xmlFileName
* @throws IOException
*/
private static void readAllKeys(String propertyFileName, String xmlFileName) throws IOException {
System.out.println("Start of readAllKeys");
Properties prop = new Properties();
FileReader reader = new FileReader(propertyFileName);
prop.load(reader);
Set<Object> keys= prop.keySet();
for(Object obj : keys){
System.out.println(propertyFileName + ":: Key="+obj.toString()+"::value="+prop.getProperty(obj.toString()));
}
//loading xml file now, first clear existing properties
prop.clear();
InputStream is = new FileInputStream(xmlFileName);
prop.loadFromXML(is);
keys= prop.keySet();
for(Object obj : keys){
System.out.println(xmlFileName + ":: Key="+obj.toString()+"::value="+prop.getProperty(obj.toString()));
}
//Now free all the resources
is.close();
reader.close();
System.out.println("End of readAllKeys");
} /**
* This method reads property files from file system
* @param propertyFileName
* @param xmlFileName
* @throws IOException
* @throws FileNotFoundException
*/
private static void readPropertyFile(String propertyFileName, String xmlFileName) throws FileNotFoundException, IOException {
System.out.println("Start of readPropertyFile");
Properties prop = new Properties();
FileReader reader = new FileReader(propertyFileName);
prop.load(reader);
System.out.println(propertyFileName +"::db.host = "+prop.getProperty("db.host"));
System.out.println(propertyFileName +"::db.user = "+prop.getProperty("db.user"));
System.out.println(propertyFileName +"::db.pwd = "+prop.getProperty("db.pwd"));
System.out.println(propertyFileName +"::XYZ = "+prop.getProperty("XYZ"));
//loading xml file now, first clear existing properties
prop.clear();
InputStream is = new FileInputStream(xmlFileName);
prop.loadFromXML(is);
System.out.println(xmlFileName +"::db.host = "+prop.getProperty("db.host"));
System.out.println(xmlFileName +"::db.user = "+prop.getProperty("db.user"));
System.out.println(xmlFileName +"::db.pwd = "+prop.getProperty("db.pwd"));
System.out.println(xmlFileName +"::XYZ = "+prop.getProperty("XYZ"));
//Now free all the resources
is.close();
reader.close();
System.out.println("End of readPropertyFile");
} /**
* This method writes Property files into file system in property file
* and xml format
* @param fileName
* @throws IOException
*/
private static void writePropertyFile(String propertyFileName, String xmlFileName) throws IOException {
System.out.println("Start of writePropertyFile");
Properties prop = new Properties();
prop.setProperty("db.host", "localhost");
prop.setProperty("db.user", "user");
prop.setProperty("db.pwd", "password");
prop.store(new FileWriter(propertyFileName), "DB Config file");
System.out.println(propertyFileName + " written successfully");
prop.storeToXML(new FileOutputStream(xmlFileName), "DB Config XML file");
System.out.println(xmlFileName + " written successfully");
System.out.println("End of writePropertyFile");
} }

当运行这段代码时,writePropertyFile 方法会在生成上述两种格式的属性文件,并將文件存储在工程的根目录下。

writePropertyFile 方法生成的两种属性文件内容:

DB.properties

#DB Config file
#Fri Nov 16 11:16:37 PST 2012
db.user=user
db.host=localhost
db.pwd=password

DB.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>DB Config XML file</comment>
<entry key="db.user">user</entry>
<entry key="db.host">localhost</entry>
<entry key="db.pwd">password</entry>
</properties>

需要注意的是comment元素,我们在使用prop.storeToXML(new FileOutputStream(xmlFileName), "DB Config XML file");这段代码时第二个参数传入的是注释内容,如果传入null,生成的xml属性文件將没有comment元素。

控制台输出内容如下:

Start of writePropertyFile
DB.properties written successfully
DB.xml written successfully
End of writePropertyFile
Start of readPropertyFile
DB.properties::db.host = localhost
DB.properties::db.user = user
DB.properties::db.pwd = password
DB.properties::XYZ = null
DB.xml::db.host = localhost
DB.xml::db.user = user
DB.xml::db.pwd = password
DB.xml::XYZ = null
End of readPropertyFile
Start of readAllKeys
DB.properties:: Key=db.user::value=user
DB.properties:: Key=db.host::value=localhost
DB.properties:: Key=db.pwd::value=password
DB.xml:: Key=db.user::value=user
DB.xml:: Key=db.host::value=localhost
DB.xml:: Key=db.pwd::value=password
End of readAllKeys
Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:434)
at java.util.Properties.load0(Properties.java:353)
at java.util.Properties.load(Properties.java:341)
at com.journaldev.util.PropertyFilesUtil.readPropertyFileFromClasspath(PropertyFilesUtil.java:31)
at com.journaldev.util.PropertyFilesUtil.main(PropertyFilesUtil.java:21)

这里报了空指针异常,原因是生成的文件保存在工程的根目录下面,而读取时是从classpath下读取,將上面生成的两个属性文件拷贝到src下再次运行程序即可。

Java&Xml教程(十)XML作为属性文件使用的更多相关文章

  1. ComicEnhancerPro 系列教程十八:JPG文件长度与质量

    作者:马健邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十八:JPG文件长度 ...

  2. IoC容器-Bean管理XML方式(引入外部属性文件)

    IoC操作Bean管理(引入外部属性文件) 1,直接配置数据库信息 (1)配置德鲁伊连接池 (2)引入德鲁伊连接池依赖jar包 2,通过引入外部属性文件配置数据库连接池 (1)创建外部属性文件,pro ...

  3. Java学习笔记——JDBC读取properties属性文件

    Java 中的 properties 文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件. 文件的内容是格式是"键=值"(key-valu ...

  4. 从.Net到Java学习第十篇——Spring Boot文件上传和下载

    从.Net到Java学习系列目录 图片上传 Spring Boot中的文件上传就是Spring MVC中的文件上传,将其集成进来了. 在模板目录创建一个新的页面 profile/uploadPage. ...

  5. 《Java大学教程》—第20章 文件处理

    记录():一个单独的数据实例.域():一个属性. 20.3    输入和输出设备:P484输入过程和输出过程.操作系统负责建立三个流(stream):标准输入流(System.in).标准输出流(Sy ...

  6. Java入门教程十(抽象类接口内部类匿名类)

    抽象类(abstract) 一个类只定义了一个为所有子类共享的一般形式,至于细节则交给每一个子类去实现,这种类没有任何具体的实例,只具有一些抽象的概念,那么这样的类称为抽象类. 在面向对象领域,抽象类 ...

  7. Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  8. Java入门教程十二(集合与泛型)

    在 Java 中数组的长度是不可修改的.然而在实际应用的很多情况下,无法确定数据数量.这些数据不适合使用数组来保存,这时候就需要使用集合. Java 的集合就像一个容器,用来存储 Java 类的对象. ...

  9. java:Properties属性文件概念

    java:Properties属性文件概念 在java之前的国际化程序中提出了一个属性文件的概念,属性文件的后缀是:*.properties,那么在java中提供了意个属性文件的专门操作类,Prope ...

  10. //读取配置文件(属性文件)的工具类-ConfigManager

    package com.pb.news.util; import java.io.IOException;import java.io.InputStream;import java.sql.Resu ...

随机推荐

  1. Swift语言学习(四)字符串与Array等集合的使用

    Swift 提供了C和Objective-C基础类型的自己一套版本,包括用于整型的Int,用于浮点值的Double和Float,用于布尔值的Boolean,和用于文本数据的String.Swift还提 ...

  2. iOS NSString拼接字符串

    NSString* str_C; // 结果字符串NSString* str_A, str_B; //已存在的字符串,需要将str_A和str_B连接起来 //方法1 str_C = [NSStrin ...

  3. 搜索好题UVA1601

    题目 分析:如果以当前3个小写字母的位置为状态,则问题转化为图上的最短路问题.但是如果每次都判断小写字母的下一步是否合法,那就是说每次移动都需要判断5^3,肯定会超时.可以把所有可以移动的格子找出来建 ...

  4. [AHOI 2005] 航线规划

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1969 [算法] 首先离线 , 将删边操作转化为加边操作 不妨首先将这张图按边-双连通 ...

  5. 学习记录:《高性能javascript》【持续更新】

    在看这本书的时候,遇到不懂得地方我一般都会百度一下.这里记录一下我在这本书里捡到的杂碎知识: 1.arrayObject.shift() 2.concat() 3.绑定监听的事件的方法(兼容IE,Fi ...

  6. JS获取子节点、父节点和兄弟节点的方法实例总结

    转自:https://www.jb51.net/article/143286.htm 本文实例讲述了JS获取子节点.父节点和兄弟节点的方法.分享给大家供大家参考,具体如下: 一.js获取子节点的方式 ...

  7. 洛谷 - P1111 - 修复公路 - 并查集

    https://www.luogu.org/problemnew/solution/P1111 并查集的水题,水题都错了好多发. 首先并不是有环就退出,而是连通分支为1才退出,每次合并成功连通分支才会 ...

  8. hdoj3183【思维】

    思路: 处理方案非常霸气啊,无奈想不到. 说是n位去m个,那么默认就是取了n-m个数字,ok,然后m #include <iostream> #include <stdio.h> ...

  9. 骨骼蒙皮动画(SkinnedMesh)的原理解析(一)

    http://blog.csdn.net/jimoshuicao/article/details/9253999 一)3D模型动画基本原理和分类 3D模型动画的基本原理是让模型中各顶点的位置随时间变化 ...

  10. Luogu P2278 [HNOI2003]操作系统【优先队列/重载运算符/模拟】 By cellur925

    题目传送门 本来是照着二叉堆的题去做的...没想到捡了个模拟...不过模拟我都不会...我好弱啊... 其实核心代码并不长,比辰哥的标程短到不知哪里去...但是思路需要清晰. 读题的时候我明白,当有优 ...