`
daoqidelv
  • 浏览: 27871 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

java中读取properties文件方法的注意事项

阅读更多
CSDN上有一篇很好的文章《 Java读取Properties文件的六种方法》,http://blog.csdn.net/senton/archive/2009/04/16/4083127.aspx。对java读取properties的方法做了总结,现在就自己在实际中遇到的问题进行下补充。

首先简单描述下《 Java读取Properties文件的六种方法》:

1。使用java.util.Properties类的load()方法
2。使用java.util.ResourceBundle类的getBundle()方法
3。使用java.util.PropertyResourceBundle类的构造函数
4。使用class变量的getResourceAsStream()方法
5。使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法
6。使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法


问题现象:
在eclipse开发环境下,程序能正常地读取properties文件,但是将工程打成jar包后,放到服务器上执行,报错“找不到系统文件:XXXX.properties”。XXXX.properties放置于工程的根目录下,代码中读取properties文件的方法是使用的上面博文中的法一:
InputStream in = new BufferedInputStream(new FileInputStream(”\\XXXX.properties“));
pro.load(in);


分析过程:
在File.Class的API中有这样一句话:“默认情况下,java.io 包中的类总是根据当前用户目录来解析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。”在代码中加入:
String userDir = System.getProperty("user.dir");

发现IDE环境下的“user.dir”为当前工程的根目录,所以能够执行,它的效果就相当于:
String userDir = System.getProperty("user.dir");
InputStream in = new BufferedInputStream(new FileInputStream(userDir +“\\XXXX.properties”));  //相当于加上“user.dir”的绝对路径
pro.load(in);

而当使用java脚本启动java程序时,“user.dir”是java程序启动的当前目录,于是将启动脚本放到和jar包同一目录下,成功!

之后,将properties放到包内,再次打包,报错。说明使用File去读取包内的文件是会出错的,因为在$user.dir$路径下并不存在独立的XXXX.properties。改而使用《 Java读取Properties文件的六种方法》介绍的法六和法四,执行通过,代码如下:
//方法五
InputStream in = ClassLoader.getSystemResourceAsStream("XXXX.properties");
//方法六
//InputStream in = Object.class.getResourceAsStream("/XXXX.properties");
pro.load(in);


结论:
properties的读取方法受到文件放置的位置的影响。当properties位于jar包内部时,使用法五和法六,当properties位于jar包外部时,使用法一,同时将java启动脚本放在jar包的同一目录下面或者在同一目录下启动java程序。

其他三种方法没有尝试。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics