1. 1.  前言

Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释最佳实践。

  1. 2.  参考方案

2.1.log4j

log4j读取配置的代码是:

PropertyConfigurator.configure(“log4j.properties”);

实际执行的文件读取是:

FileInputStream istream = new FileInputStream(configFileName);

也就是执行环境${PWD}中查找文件,这个路径与new File()的路径是一样的。

2.2.hibernate

hibernate读取配置的代码是:

Configuration configuration = new Configuration().configure(“hibernate.cfg.xml”);

实际执行的文件读取是:

String stripped = resource.startsWith(“/”) ? resource.substring(1) : resource;

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

InputStream stream = classLoader.getResourceAsStream(stripped);

是通过类加载器的相对路径来查找文件,这种方式好处是可以读取jar中的文件,而且是new File()无法模拟的。

  1. 3.  方案分析

3.1.方案对比

相对而言,hibernate的文件读取更加实用,主要因为可以读取普通文件,也可以读取jar/war中的文件,相对更通用。

3.2.参考文档

更常见的情况是使用Class.getResourceAsStream(String name),实际上最终会调用ClassLoader.getSystemResourceAsStream,但很多人对于getResourceAsStream并不完全理解,所以很疑惑有些时候需要在路径上加上“/”,有些时候不用。

简单来说ClassLoader的基础路径是固定,而Class的基础路径则不相同,所以ClassLoader都是相对路径,Class读取则存在绝对路径和相对路径两种情况。

Class.getResourceAsStream文档中有解释:

(1)如果name以“/”开头,则是读取${PWD}下的文件。应用与读取jar同级别路径的文件如hibernate.cfg.xml。

(2)如果name不以“/”开头,则是读取Class所在路径package下的文件。应用于读取与Class有关的文件如*.hbm.xml。

  1. 4.  实践应用

4.1.最优方案

由于Class.getResourceAsStream会继续调用ClassLoader的方法,那么建立一个单例的ClassLoader是最优的方案,比如hibernate的实现。

结合maven来说,src/main/resources中的文件都使用ClassLoader.getSystemResourceAsStream(“log4j.properties”)方式读取,对于*.hbm.xml等ORM映射文件等则需要加上包路径,如“com/zheezes/*.hbm.xml”。

4.2.最佳实践

不过由于getClass()方式更简洁,而且性能损失非常小,所以实际使用中,直接调用getClass().getResourceAsStream()的方式更为常用。

结合maven来说,src/main/resources中的文件都使用绝对路径getClass().getResourceAsStream(“/log4j.properties”)方式读取,对于*.hbm.xml等ORM映射文件则一般在PO的Class中直接使用相对路径“*.hbm.xml”来读取。

java 读取文件最佳实践的更多相关文章

  1. 转载--JAVA读取文件最佳实践

    1.  前言 Java应用中很常见的一个问题,如何读取jar/war包内和所在路径的配置文件,不同的人根据不同的实践总结出了不同的方案,但其他人应用却会因为环境等的差异发现各种问题,本文则从原理上解释 ...

  2. paip.复制文件 文件操作 api的设计uapi java python php 最佳实践

    paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi   copy() =====java的无,要自己写... ====php   copy ...

  3. 使用DataStax Java驱动程序的最佳实践

    引言 如果您想开始建立自己的基于Cassandra的Java程序,欢迎! 也许您已经参加过我们精彩的DataStax Academy课程或开发者大会,又或者仔细阅读过Cassandra Java驱动的 ...

  4. 避免Java中NullPointerException的Java技巧和最佳实践

    Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢.下面我们就从几个方面来入手,解决这个棘手的​问题吧.​ 值得庆幸的是,通过应用 ...

  5. Java 网络编程最佳实践(转载)

    http://yihongwei.com/2015/09/remoting-practice/ Java 网络编程最佳实践 Sep 10, 2015 | [Java, Network] 1. 通信层 ...

  6. [Java]读取文件方法大全(转)

    [Java]读取文件方法大全   1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {     /**     ...

  7. Java 读取文件的内容

    Java 读取文件的内容 1) CLASS_NAME: 换成自己真实的类名 2) /page/test.json: 换成自己真实的page 3) FileUtils: 来自于org.apache.co ...

  8. Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和区别

    一.Java读取和存储文件数据流 Java读取文件,实际是将文件中的字节流转换成字符流输出到屏幕的过程   这里面涉及到两个类:InputStreamReader和OutputStreamWriter ...

  9. Atitit. 拉开拉链zip文件 最佳实践实施 java c# .net php

    Atitit. 拉开拉链zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzi ...

随机推荐

  1. dom4j-1.6.1.jar与dom4j-1.4.jar

    今天在上线的项目中遇到一个很奇怪的问题 File file = new File("O:/20160817/91a2cb1c-62eb-4a31-a1f6-3af8ab71782a/adi6 ...

  2. js中cookie的使用

    js中并没有封装好的存储cookie,取得cookie和删除cookie的函数,所以必须得自己手动处理,并且cookie中也只能存储字符串,不能存储数组等复杂的数据类型. // 添加cookie fu ...

  3. linux centos 6.5 运行MySQL Workbench 6.0找不到 libmysqlclient.so.16和libmysqlclient_r.so.16

    找到已安装mysql/lib目录下有类似文件: -rw-r--r-- root root 12月 : libmysqlclient.a lrwxrwxrwx root root 12月 : libmy ...

  4. R----dplyr包介绍学习

    dplyr包:plyr包的替代者,专门面对数据框,将ddplyr转变为更易用的接口 %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以 ...

  5. [问题2014A03] 复旦高等代数 I(14级)每周一题(第五教学周)

    [问题2014A03]  设 \(A=(a_{ij})\) 为 \(n\,(n\geq 3)\) 阶方阵,\(A_{ij}\) 为第 \((i,j)\) 元素 \(a_{ij}\) 在 \(|A|\) ...

  6. Web页面速度测试工具

    开发框架的时间,想测试单例和多例下对性能的影响,找了下没有特别简单易用的测试工具. 估摸着搞了一个小工具. 针对.net Framework的2.0,3.5,4.0版本. WebHttpTest2.0 ...

  7. h-ui前端框架

    h-ui.net

  8. [转] 控制Arduino的利器-Windows Remote Arduino

    原文地址:控制Arduino的利器-Windows Remote Arduino 1. 概述 相信很多朋友已经在玩 Arduino了,而且一般都是使用官方的Arduino IDE来写程序控制Ardui ...

  9. Sprint(第四天11.17)

    燃尽图

  10. ubuntu 安装eclipse,adt,android sdk,离线

    1.安装jdk 环境变量 $ sudo gedit ~/.bashrc export JAVA_HOME=/usr/local/jdk1.8.0_65export JRE_HOME=${JAVA_HO ...