Java读取Properties配置文件几点注意事项

java里加载Properties文件都是通过Java.util包里的Properties类的load()方法来加载一个Properties配置文件,load()方法需要接收一个文件输入流,而InputStream的构建需要Java.io.File对象,即new FileInputStream(new File(path));现在问题就集中在如何动态获取

ava里加载Properties文件都是通过Java.util包里的Properties类的load()方法来加载一个Properties配置文件,load()方法需要接收一个文件输入流,而InputStream的构建需要Java.io.File对象,即new FileInputStream(new File(path));现在问题就集中在如何动态获取这个路径。
下面以一个示例来说明吧。如图:

 ActionFactory类图示

现在ActionFactory类里需要读取src目录下的config.properties文件。我们知道,java web项目编译后src目录对应的是应该是WEB-INF下的classes目录,所以我们可以先获取到ActionFactory.class文件,再根据相对路径采用../一步一步返回上一级得到config.properties文件的路径,于是有了第一种写法:
InputStream stream = this.getClass().getResourceAsStream("../../../../config.properties");//这里的this指的是ActionFActory类
pro.load(stream);
当然我们也可以通过类加载器根据一个相对路径返回一个文件输入流,即ClassLoader的getResourceAsStream方法。我们知道项目里的所有java文件编译后最终都是相对于WEB-INF下的classes目录存放的,而config.properties文件发布后的路径刚好是以classes目录为根目录。
所以我们通过项目里的类获取类加载器从而得到文件流,于是又有了第二种写法:
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
pro.load(stream);
注意这里的this指的是ActionFActory类,当然你可以把它换成项目里的其他自定义类,因为项目里类虽不同,但都是使用的同一类
加载器。但是还要注意一点的是,注意我上面绿色标识的内容,是其他自定义类,而不能换成其他任意类。比如java.lang.Thread类就不行。这是你肯定会有这个疑问:为什么通过Thread类得不到类加载器?这个还得从JVM加载类说起。JVM启动时会首先使用JVM默认的系统类加载器帮我们加载一些jar,那到底JVM都自动帮我们加载了那些JAR文件到内存去了呢?具体请看图:

 所需jar包

也就是说,如图所示红色方框表示的jar里的所有类.getClassLoader()得到的都是null,因为它们都是由JVM系统类加载器加载的,而Java的安全机制是不允许你获取系统类加载器对象的。
理解了上面那些,那我们还可以这样写:
InputStream stream=Thread.currentThread().getClass().getResourceAsStream("/config.properties");
但不能这样写:
InputStream stream = Thread.currentThread().getClass().getClassLoader().getResourceAsStream("config.properties");
但可以这样写:
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("config.properties");
InputStream stream = new FileInputStream("/config.properties");  //相对于项目web-inf/classes目录
为什么 我就不再解释了吧。
如果是在web项目中,我们还可以这样写:
InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");
不过servlet已经帮我们封装了,我们一般这样写:
ServletContext.getRealPath("/")  这里的斜杠是相对与项目部署后的WebRoot为根目录。
        看似简单的一个问题,如果深入的话,就不简单了。以后再遇到这种问题,就不会犯迷糊咯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值