Java中Properties配置文件读取
以下实践的是Properties配置文件的基本操作方法。像spring使用xml做依赖注入时,这个配置文件起到非常实用的作用。
一、格式规范
参考wiki百科的格式简介:https://zh.wikipedia.org/wiki/.properties,说明如下:
每个.properties 文件中的行通常存储单个属性。对于每一行可能有这么几种格式,包括键=值,键 = 值,键:值,以及键 值。
.properties文件可以使用井号(#)或叹号(!)作为一行中第一个非空白字符来表示它后面的所有文本都是一个注释。反斜杠(\)用于转义字符。
提供的示例如下:
# You are reading the ".properties" entry.
! The exclamation mark can also mark text as comments.
# The key and element characters #, !, =, and : are written with
# a preceding backslash to ensure that they are properly loaded.
website = http\://en.wikipedia.org/
language = English
# The backslash below tells the application to continue reading
# the value onto the next line.
message = Welcome to \
Wikipedia\!
# Add spaces to the key
key\ with\ spaces = This is the value that could be looked up with the key "key with spaces".
# Unicode
tab : \u0009\u4E2D\u6587
接下来在eclipse测试可行性。使用最简单的代码:
Properties prop = new Properties();
try {
prop.load(Main.class.getResourceAsStream("test.properties"));
for (Object key : prop.keySet()) {
System.out.println(key + "=" + prop.get(key));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
正常输出,没任何报错,结果如下:

所以,参照wiki百科的写法是完全兼容的。但是有一点需要注意的:为了避免读取简单易懂,最好不要换行;和中文会转换成Unicode,当要写中文时,建议用英文或者拼音代替。
提示:很多专业的写法会分模块写,比如Test.ProjectName=Test;这样也是完全兼容的。
二、存放位置及读取
注意:非必要的时候不要使用绝对路径,除非非常确定配置文件的位置。
读取的重点在于路径,路径之后就是获取文件流。参考此处进行文件路径的获取:http://www.cnblogs.com/EasonJim/p/6503612.html,实质上除了路径获取外其它方法有提供流的获取。
application:
1、存放:在jar包中其实任何位置都可以放,因为最终都会按照开发工程的目录结构复制到jar包中,只要获取的方式对就可以了。比如放在src外面,src里面的特定包中,METE-INF文件夹内部等都可以。但是不要放在项目的根目录,因为默认打jar包是不会复制进去的。
存放位置参考:

最终默认打application包时的目录如下:

但是如果要把test3.properties文件打包进jar包时,可以手动Export导出jar包,包含进去:

最终得到如下jar包目录:

但是非常不建议这么做,主要有如下几点问题存在:
①如果使用File对象(http://www.cnblogs.com/EasonJim/p/6503612.html#autoid-0-1-0第二点)读取文件时,指向的目录是工作目录;如果是eclipse运行时,指向的是eclipse的工作目录;而用jar包运行时,指向的就是jar包所在的目录;那么也就是说读取的不是jar包内的文件,而是外部的文件;所以用File对象去读取的方法在jar包上不可取。
②如果使用Class.class.getResource这类方法(http://www.cnblogs.com/EasonJim/p/6503612.html#autoid-0-2-0第三点)获取的路径,在eclipse上获取是编译后class目录,而这个目录默认只会复制src/appClientModule目录下的文件,在项目根目录下的文件是不会复制过去的,所以在eclipse上无法获取到;但是通过后期打包加入test3.properties时,在jar包上本身和class同一级目录,所以此时可以正常读取。这样一来也就是和调试时都不能同步,所以这里不建议放在根目录。
2、读取:参考:http://blog.csdn.net/u011063151/article/details/51888640
以下为用File对象和类方法获取以上目录结构文件的方法:
①File对象(不建议使用):
参考:http://www.cnblogs.com/EasonJim/p/6503612.html#autoid-0-1-0(第二中方法)
java.util.Properties类的load方法传入的参数为InputStream,所以只要根据File对象构建出来即可,代码如下:
new BufferedInputStream(new FileInputStream(new File("test3.properties")));
new BufferedInputStream(new FileInputStream(new File("appClientModule/test.properties")));
new BufferedInputStream(new FileInputStream(new File("appClientModule/META-INF/test2.properties")));
new BufferedInputStream(new FileInputStream(new File("appClientModule/properties/test/test1.properties")));
②类方法获取(推荐使用):
类方法获取有很多种,参考:http://www.cnblogs.com/EasonJim/p/6503612.html#autoid-0-2-0(第三种方法)
但是,用类方法获取test3.properties文件就无法在elipse中获取。所以下面代码将省略,代码如下:
Main.class.getResourceAsStream("/test.properties");
Main.class.getResourceAsStream("/properties/test/test1.properties");
Main.class.getResourceAsStream("/META-INF/test2.properties");
Main.class.getClassLoader().getResourceAsStream("test.properties");
Main.class.getClassLoader().getResourceAsStream("properties/test/test1.properties");
Main.class.getClassLoader().getResourceAsStream("META-INF/test2.properties");
Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties");
Thread.currentThread().getContextClassLoader().getResourceAsStream("properties/test/test1.properties");
Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/test2.properties");
ClassLoader.getSystemClassLoader().getResourceAsStream("test.properties");
ClassLoader.getSystemClassLoader().getResourceAsStream("properties/test/test1.properties");
ClassLoader.getSystemClassLoader().getResourceAsStream("META-INF/test2.properties");
注意:上面开头的斜杠写法,以及包的路径写法。
经过测试上面路径在jar上正常运行:

下面开始测试各个类库对properties文件的读取:
注意:由于File对象的局限性,所以不作为测试。
① 使用java.util.Properties类的load(InputStream in)方法加载properties文件:
Properties prop2 = new Properties();
prop2.load(Main.class.getResourceAsStream("/test.properties"));
System.out.println(prop2.getProperty("message"));
prop2.load(Main.class.getResourceAsStream("/properties/test/test1.properties"));
System.out.println(prop2.getProperty("message"));
prop2.load(Main.class.getResourceAsStream("/META-INF/test2.properties"));
System.out.println(prop2.getProperty("message")); System.out.println(""); Properties prop3 = new Properties();
prop3.load(Main.class.getClassLoader().getResourceAsStream("test.properties"));
System.out.println(prop3.getProperty("message"));
prop3.load(Main.class.getClassLoader().getResourceAsStream("properties/test/test1.properties"));
System.out.println(prop3.getProperty("message"));
prop3.load(Main.class.getClassLoader().getResourceAsStream("META-INF/test2.properties"));
System.out.println(prop3.getProperty("message")); System.out.println(""); Properties prop4 = new Properties();
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties"));
System.out.println(prop4.getProperty("message"));
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("properties/test/test1.properties"));
System.out.println(prop4.getProperty("message"));
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/test2.properties"));
System.out.println(prop4.getProperty("message")); System.out.println(""); Properties prop5 = new Properties();
prop5.load(ClassLoader.getSystemClassLoader().getResourceAsStream("test.properties"));
System.out.println(prop5.getProperty("message"));
prop5.load(ClassLoader.getSystemClassLoader().getResourceAsStream("properties/test/test1.properties"));
System.out.println(prop5.getProperty("message"));
prop5.load(ClassLoader.getSystemClassLoader().getResourceAsStream("META-INF/test2.properties"));
System.out.println(prop5.getProperty("message"));
eclipse输出结果:

jar输出结果:

测试一切正常。
②使用java.util.ResourceBundle类的getBundle()方法:
注意:这个getBundle()方法的参数只能写成包路径+properties文件名,也就说不用带文件的后缀。
System.out.println(ResourceBundle.getBundle("test").getString("message"));
System.out.println(ResourceBundle.getBundle("properties/test/test1").getString("message"));
System.out.println(ResourceBundle.getBundle("META-INF/test2").getString("message"));
eclipse输出结果:

jar输出结果:

测试一切正常。
③使用java.util.PropertyResourceBundle类的构造函数:
System.out.println(new PropertyResourceBundle(Main.class.getResourceAsStream("/test.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Main.class.getResourceAsStream("/properties/test/test1.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Main.class.getResourceAsStream("/META-INF/test2.properties")).getString("message"));
System.out.println("");
System.out.println(new PropertyResourceBundle(Main.class.getClassLoader().getResourceAsStream("test.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Main.class.getClassLoader().getResourceAsStream("properties/test/test1.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Main.class.getClassLoader().getResourceAsStream("META-INF/test2.properties")).getString("message"));
System.out.println("");
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("properties/test/test1.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/test2.properties")).getString("message"));
System.out.println("");
System.out.println(new PropertyResourceBundle(ClassLoader.getSystemClassLoader().getResourceAsStream("test.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(ClassLoader.getSystemClassLoader().getResourceAsStream("properties/test/test1.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(ClassLoader.getSystemClassLoader().getResourceAsStream("META-INF/test2.properties")).getString("message"));
eclipse输出结果:

jar输出结果:

测试一切正常。
测试工程:https://github.com/easonjim/5_java_example/tree/master/propertiestest/application
Web:
1、存放:
基本都是任意位置,但是不能放在项目根目录,如下图所示参考:

对于最优的放置位置,参考:http://stackoverflow.com/questions/2161054/where-to-place-and-how-to-read-configuration-resource-files-in-servlet-based-app,说:如果propertiesfile是webapp特定的,最好是放置它/WEB-INF/classes。如果您在IDE中开发标准WAR项目,请将其放在src文件夹(项目的源文件夹)中。如果你使用Maven项目,将其放在/main/resources文件夹中。
2、读取:
①使用java.util.Properties类的load(InputStream in)方法加载properties文件:
Properties prop2 = new Properties();
prop2.load(Index.class.getResourceAsStream("/test4.properties"));
System.out.println(prop2.getProperty("message"));
prop2.load(Index.class.getResourceAsStream("/properties/test/test5.properties"));
System.out.println(prop2.getProperty("message"));
prop2.load(Index.class.getResourceAsStream("/webtest/test7.properties"));
System.out.println(prop2.getProperty("message"));
//以下为servlet独有
prop2.load(request.getSession().getServletContext().getResourceAsStream("/META-INF/test3.properties"));
System.out.println(prop2.getProperty("message"));
prop2.load(request.getSession().getServletContext().getResourceAsStream("/WEB-INF/lib/test6.properties"));
System.out.println(prop2.getProperty("message"));
prop2.load(request.getSession().getServletContext().getResourceAsStream("/WEB-INF/test2.properties"));
System.out.println(prop2.getProperty("message"));
prop2.load(request.getSession().getServletContext().getResourceAsStream("/test1.properties"));
System.out.println(prop2.getProperty("message")); System.out.println(""); Properties prop3 = new Properties();
prop3.load(Index.class.getClassLoader().getResourceAsStream("test4.properties"));
System.out.println(prop3.getProperty("message"));
prop3.load(Index.class.getClassLoader().getResourceAsStream("properties/test/test5.properties"));
System.out.println(prop3.getProperty("message"));
prop3.load(Index.class.getClassLoader().getResourceAsStream("webtest/test7.properties"));
System.out.println(prop3.getProperty("message"));
prop3.load(Index.class.getClassLoader().getResourceAsStream("../../META-INF/test3.properties"));
System.out.println(prop3.getProperty("message"));
prop3.load(Index.class.getClassLoader().getResourceAsStream("../lib/test6.properties"));
System.out.println(prop3.getProperty("message"));
prop3.load(Index.class.getClassLoader().getResourceAsStream("../test2.properties"));
System.out.println(prop3.getProperty("message"));
prop3.load(Index.class.getClassLoader().getResourceAsStream("../../test1.properties"));
System.out.println(prop3.getProperty("message")); System.out.println(""); Properties prop4 = new Properties();
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("test4.properties"));
System.out.println(prop4.getProperty("message"));
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("properties/test/test5.properties"));
System.out.println(prop4.getProperty("message"));
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("webtest/test7.properties"));
System.out.println(prop4.getProperty("message"));
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("../../META-INF/test3.properties"));
System.out.println(prop4.getProperty("message"));
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("../lib/test6.properties"));
System.out.println(prop4.getProperty("message"));
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("../test2.properties"));
System.out.println(prop4.getProperty("message"));
prop4.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("../../test1.properties"));
System.out.println(prop4.getProperty("message")); System.out.println(""); //ClassLoader.getSystemClassLoader().getResourceAsStream()在web中不可用
/*Properties prop5 = new Properties();
prop5.load(ClassLoader.getSystemClassLoader().getResourceAsStream("test4.properties"));
System.out.println(prop5.getProperty("message"));
prop5.load(ClassLoader.getSystemClassLoader().getResourceAsStream("properties/test/test5.properties"));
System.out.println(prop5.getProperty("message"));
prop5.load(ClassLoader.getSystemClassLoader().getResourceAsStream("webtest/test7.properties"));
System.out.println(prop5.getProperty("message"));*/
注意:上面的地址上巧妙的使用了【..】来返回上一级,并使用此方法替代了servlet特有的方法。
eclips中输出:

war包输出:

测试一切正常。
②使用java.util.ResourceBundle类的getBundle()方法:
注意:这个getBundle()方法的参数只能写成包路径+properties文件名,也就说不用带文件的后缀。
System.out.println(ResourceBundle.getBundle("test4").getString("message"));
System.out.println(ResourceBundle.getBundle("properties/test/test5").getString("message"));
System.out.println(ResourceBundle.getBundle("webtest/test7").getString("message"));
//以下无法正常获取
/*System.out.println(ResourceBundle.getBundle("/../../META-INF/test3").getString("message"));
System.out.println(ResourceBundle.getBundle("../lib/test6").getString("message"));
System.out.println(ResourceBundle.getBundle("../test2").getString("message"));
System.out.println(ResourceBundle.getBundle("../../test1").getString("message"));*/
eclips中输出:

war包输出:

测试一切正常。
③使用java.util.PropertyResourceBundle类的构造函数:
System.out.println(new PropertyResourceBundle(Index.class.getResourceAsStream("/test4.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Index.class.getResourceAsStream("/properties/test/test5.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Index.class.getResourceAsStream("/webtest/test7.properties")).getString("message"));
//以下为servlet独有
System.out.println(new PropertyResourceBundle(request.getSession().getServletContext().getResourceAsStream("/META-INF/test3.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(request.getSession().getServletContext().getResourceAsStream("/WEB-INF/lib/test6.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(request.getSession().getServletContext().getResourceAsStream("/WEB-INF/test2.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(request.getSession().getServletContext().getResourceAsStream("/test1.properties")).getString("message"));
System.out.println("");
System.out.println(new PropertyResourceBundle(Index.class.getClassLoader().getResourceAsStream("test4.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Index.class.getClassLoader().getResourceAsStream("properties/test/test5.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Index.class.getClassLoader().getResourceAsStream("webtest/test7.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Index.class.getClassLoader().getResourceAsStream("../../META-INF/test3.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Index.class.getClassLoader().getResourceAsStream("../lib/test6.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Index.class.getClassLoader().getResourceAsStream("../test2.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Index.class.getClassLoader().getResourceAsStream("../../test1.properties")).getString("message"));
System.out.println("");
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("test4.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("properties/test/test5.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("webtest/test7.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("../../META-INF/test3.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("../lib/test6.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("../test2.properties")).getString("message"));
System.out.println(new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("../../test1.properties")).getString("message"));
eclips中输出:

war包输出:

测试一切正常。
测试工程:https://github.com/easonjim/5_java_example/tree/master/propertiestest/web
三、操作:
对于操作,这里不做测试,一般原生方法中,只有Properties类的store方法。
Java中Properties配置文件读取的更多相关文章
- Java中properties可以读取,但是里面的数据读取不到
今天配置一个项目jdbc.properties这个文件里面的键值总是读取不到,刚开始以为是文件没有读取到,但是测试是读取到的,再排查键值是不是写错了, 后来发现键值是对的,这就很奇怪了 比较是没有任何 ...
- Java中Properties类
1 简介: JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,用map来存储key-value数据,所以存入的数据是无序的.其中键和值都是字符串类型 ...
- properties配置文件读取操作总结【java笔记】
声明:本文所有例子中的 properties 文件均放在 src 目录下,ecclipse 软件自动增加 一.基本概念 1.1 properties文件,存储格式 键=值. properties文件 ...
- 【转】Java 读写Properties配置文件
[转]Java 读写Properties配置文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形 ...
- Java 读写Properties配置文件
Java 读写Properties配置文件 JAVA操作properties文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了M ...
- java基础---->java中Properties的使用
Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支 持的配置文件,配置文件中很多变量是经常改变的,这样做也 ...
- Java之properties文件读取
1.工程结构 2.ConfigFileTest.java package com.configfile; import java.io.IOException; import java.io.Inpu ...
- @Value和@PropertySource实现*.properties配置文件读取过程和实现原理
@Value和@PropertySource实现*.properties 配置文件读取过程和实现原理 1 配置使用步骤 (1)右击resource目录添加*.prooerties配置文件
- Java中Properties类的操作配置文件
知识学而不用,就等于没用,到真正用到的时 候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用 Java来写, ...
随机推荐
- Redis实现之数据库(一)
服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构体的db数组中,db数组的每个项都是一个redis.h/redisDb结构体,每个redisD ...
- 《Scrum实战》第4次课【全职的Scrum Master】作业汇总
1组: 孟帅 http://www.cnblogs.com/mengshuai1982/p/7375008.html 3组: 张亚辉 http://www.jianshu.com/p/df9eee08 ...
- PostgreSql基础命令及问题总结
本章内容: 1.基本命令 基本命令 1.psql -U cdnetworks_beian -d cdnetworks_beian #-U指定用户,-d指定数据库 2.\l ...
- error LNK2001: unresolved external symbol ___CxxFrameHandler3
Q: VS2005编译的静态库, 在vc++6.0中连接出现错误 error LNK2001: unresolved external symbol ___CxxFrameHandler3 A: ...
- 【Candy】cpp
题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...
- linux环境搭建系列之memcached安装步骤
1.从官网在线下载最新的安装包 wget http://memcached.org/downloads/memcached-1.4.34.tar.gz 该命令为在线下载 注意:最新的地址会变动,所以最 ...
- 爬虫:Scrapy3 - Items
Item 对象是种简单的容器,保存了爬取到得数据.其提供了类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法. 声明Item import scrapy class P ...
- jquery怎样获取html页面中的data-xxx
$(this).attr("data-id") // will return the string "123"or .data() (if you use ne ...
- PDF文件加密怎么转换成word
1.将文档拖入Chrome浏览器 2. 3.右上角打印,然后会提示 另存为本地,然后再用word或者福昕套件转换就行
- 想象一下(imagine)
想象一下(imagine) 题目描述 我们高大的老班举起了有半个他那么高的三角板,说:"你们想象一下--" 于是你就陷入了想象-- 有一棵n个点的树,每个叶子节点上都有一个人,他们 ...