zoukankan      html  css  js  c++  java
  • Java读取Properties配置文件几点注意事项

    Java里加载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为根目录。
            看似简单的一个问题,如果深入的话,就不简单了。以后再遇到这种问题,就不会犯迷糊咯,哈哈~~~~~

     
  • 相关阅读:
    POJ2945 Find the Clones trie树
    BZOJ 3796 Mushroom追妹纸 哈希+二分(+KMP)
    java-web的mybatis的学习
    关于字符串split一些用法
    hive 中简单的udf函数编写
    hive 用户行为分析(活跃。启动,留存,回访,新增)的一些经典sql
    浏览收藏夹 看到了hadoop3.0 的改动
    pythonDay01
    关于java 操作linux命令的 一些相关
    需求中碰到的简单Map集合 key相同合并 value的思路
  • 原文地址:https://www.cnblogs.com/hua-an/p/5265903.html
Copyright © 2011-2022 走看看