论坛首页 Java企业应用论坛

『提问』寻求读取配置文件的更好方法

浏览 6698 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-09-01  
软件环境:
win32
配置文件:

错误提示信息:

你的分析:
     有一些配置文件(自己定义的)也许同类文件一起存在在文件夹中(比如class\下面),也许有可能被压缩成jar,存在在jar的包中.
     当我想读取配置文件的时候,我目前用到的方法是根据加载的类路径,找到URL,然后根据URL的前缀为file:或者jar:来判断,如果是file,那么直接读取就可以了,如果是jar,那么就用java.util.jar包中的相关API解决.
    不过,我总觉得这样相当麻烦,从理论上讲,JVM加载jar和加载普通的文件夹中的类应该是屏蔽了这样的区别. 但是从inputstream的所有实现中(非ZIP和jar实现)都不能通过URL来读,必须是文件实际存储路径.
    不知道是否有其他的第三方组件封装了这样的访问,或者有其他相应的方法?
   发表时间:2004-09-01  
简单方法:
YourClass.class.getClassLoader().getResourceAsStream("your.configuration.file");

第3方工具:
http://www.opensymphony.com/oscore/api/com/opensymphony/util/FileManager.html
0 请登录后投票
   发表时间:2004-09-01  
可能有点跑题,不过好象也有些关联:
今天把程序理原来用java.util.Properties的地方改成用java.util.Preferences了。用起来很方便,也没有发现什么不正常的地方,不过好象很少看见人用.这个东东有什么问题吗?
0 请登录后投票
   发表时间:2004-09-01  
如果经常通过getResourceAsStream()方法来获得位于CLASSPATH下的资源, 就会注意到java.lang.Class和java.lang.ClassLoader都有getResourceAsStream()方法. 两者的功能是一样的, 还是另有玄机?

用下面的两个properties文件和两个类来做一个实验. 文件的目录结构如下:
  CLASSPATH/
             RootLoader.class
             rootresource.properties

             subpkg/
                     SubLoader.class
                     subresource.properties


在RootLoader和SubLoader中分别对Class.getResourceAsStream()与ClassLoader.getResourceAsStream()传入这样的三个参数"rootresource.properties", "subresource.properties", "subpkg/subresrouce.properties". 下面是运行的结果:
D:\workspace\java>java -cp . Main
[root class] got rootresource.properties
[root class] lost subresource.properties
[root class] got subpkg/subresource.properties
[root classloader] got rootresource.properties
[root classloader] lost subresource.properties
[root classloader] got subpkg/subresource.properties
[sub class] lost rootresource.properties
[sub class] got subresource.properties
[sub class] lost subpkg/subresource.properties
[sub classloader] got rootresource.properties
[sub classloader] lost subresource.properties
[sub classloader] got subpkg/subresource.properties


可以看到, ClassLoader.getResourceAsStream()不受具体Class所在Package的影响, 两次表现一致.
但是Class.getResourceAsStream()就变化多多, 主要还是受限于Class所在的Package. 这样的表现很类似文件系统中的路径. 如果把Package的定义比作路径, 那么Class.getResourceAsStream()接受的参数就是相对路径(在本级和下级package寻找资源), 而ClassLoader.getResourceAsStream()则是接受绝对路径(始终从顶级Package开始寻找).

以前一直发现用Class.getResourceAsStream()找不到该有的东西, 所以今天就试了一下 ;)

P.S. 这是自己看ClassLoader的时候记的, 相信对于在ClassPath下加载资源还是有用的. 正如ReadOnly所言, 这样可以屏蔽掉jar中文件和非jar中文件的区别 ;)
0 请登录后投票
   发表时间:2004-09-01  
goncha 写道
如果把Package的定义比作路径, 那么Class.getResourceAsStream()接受的参数就是相对路径(在本级和下级package寻找资源)


相对路径不一定是本级和下级, 试试看:
Class.getResourceAsStream("../abc.txt");

Class.getResourceAsStream的方法其实就是解析一下相对路径, 然后再调用ClassLoader的getResourceAsStream方法. 2个方法是一样的.
0 请登录后投票
   发表时间:2004-09-01  
谢谢楼上各位,我刚刚一下子突然发现原来是很简单的问题.
      通过ClassLoader获得Resource得到URL,直接用URL的openStream方法就可以打开了.同readonly提供的一样,惭愧惭愧.
      其实现在的蛮多开源代码都是这样写的,不知道是自己一下子脑袋卡壳还是偷懒,呵呵,提了一个不该问的问题,呵呵.
      最后,再谢谢楼上各位.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics