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来写, ...
随机推荐
- Java消息中间件--初级篇
一. 为什么使用消息中间件? 假设用户登录系统 传统方式 用户登录 调用短息服务 积分服务 日志服务等各种服务 如果短息服务出现问题就无法发送短信而且用户登录成功必须所有调用全部完成返回 ...
- MySQL安装教程&Navicat安装
一.下载MySQL http://jingyan.baidu.com/article/e3c78d64412ae83c4c85f5fd.html 首先打开MySQL官网,找到Downloads标签,点 ...
- hdu3374 String Problem 最小最大表示法 最小循环节出现次数
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int ...
- 我给女朋友讲编程CSS系列(2)- CSS语法、3大选择器、选择器优先级
首先看一下使用Css设置h1标签字体颜色和大小的例子,效果图如下: 新建一个网页test.html,然后复制粘贴下面的内容: <html> <head> <style t ...
- [转]9个基于Java的搜索引擎框架
9个基于Java的搜索引擎框架 在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友欢心,你也会在百度上寻找正规的 ...
- 【Rotate List】cpp
题目: Given a list, rotate the list to the right by k places, where k is non-negative. For example:Giv ...
- OOP的三大特性------封装、继承、多态
封装 1.<1>类背后隐藏的思想是数据抽象和封装 <2>信息隐藏,隐藏对象的实现细节,不让外部直接访问到 将数据成员和成员函数一起包装到一个单元里,单元以类的形式实现 < ...
- redis学习(七)jedis客户端
1.下载jedis的jar包 http://repo1.maven.org/maven2/redis/clients/jedis/2.8.1/ 2.启动redis后台 3.测试联通 package c ...
- mac 安装 java 配置
在mac电脑上开发java,需要配置java环境变量,mac不同于windows系统.不过呢,配置流程也相对简单. 安装jdk 首先查看,电脑上是否装了jdk. 在终端输入 java -versio ...
- gradle ofbiz 16 开发环境搭建
原 gradle ofbiz 16 开发环境搭建 2017年02月13日 10:59:19 阅读数:2702 1.安装jdk 2.配置jdk环境变量 3.eclipse 安装svn 插件 4.svn下 ...