Java将配置文件当作一种资源(resource)来处理,并且提供了两个类来读取这些资源,一个是Class类,另一个是ClassLoader类。

gradle 项目 项目目录结构 

用Class类加载资源文件

public InputStream getResourceAsStream(String name)

查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResourceAsStream(java.lang.String)。 >

在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:

如果 name 以 ‘/’ 开始 (‘\u002f’),则绝对资源名是 ‘/’ 后面的 name 的一部分。 否则,绝对名具有以下形式: modified_package_name/name 其中 modified_package_name 是此对象的包名,该名用 ‘/’ 取代了 ‘.’ (‘\u002e’)。

用ClassLoader类加载资源文件

public InputStream getResourceAsStream(String name)

返回读取指定资源的输入流。

完整demo

package test.mybatis;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; /**
* Created on 2016/11/14 0014.
*
* @author zlf
* @since 1.0
*/
public class ResourceLoader { ClassLoader defaultClassLoader;
ClassLoader systemClassLoader; ResourceLoader() {
try {
//初始化类加载器
systemClassLoader = ClassLoader.getSystemClassLoader();
} catch (SecurityException ignored) {
// AccessControlException on Google App Engine
}
} public static void main(String[] args) throws IOException {
ResourceLoader resourceLoader = new ResourceLoader();
resourceLoader.loadProperties1();//ClassLoader
resourceLoader.loadProperties2();//classLoader
resourceLoader.loadProperties3();//class
resourceLoader.loadProperties4();//class
resourceLoader.loadProperties5();//class
resourceLoader.loadProperties6();//mybatis中调用系统classLoader
resourceLoader.loadProperties7();//mybatis中调用系统classLoader } public void loadProperties1() throws IOException {
try (
InputStream input = ResourceLoader.class.getClassLoader().getResourceAsStream("test/mybatis/test.properties");
) {
printProperties(input);
} } public void loadProperties2() throws IOException {
try (
InputStream input = ResourceLoader.class.getClassLoader().getResourceAsStream("test.properties");
) {
printProperties(input);
} } public void loadProperties3() throws IOException {
try (
InputStream input = ResourceLoader.class.getResourceAsStream("test.properties");
) {
printProperties(input);
} } public void loadProperties4() throws IOException {
try (
InputStream input = ResourceLoader.class.getResourceAsStream("/test.properties");
) {
printProperties(input);
} } public void loadProperties5() throws IOException {
try (
InputStream input = ResourceLoader.class.getResourceAsStream("/test/mybatis/test.properties");
) {
printProperties(input);
} } public void loadProperties6() throws IOException {
ClassLoader classLoader = new ClassLoader() {
};
try (
InputStream input = getResourceAsStream("test/mybatis/test.properties");
) {
printProperties(input);
} } public void loadProperties7() throws IOException {
try (
InputStream input = getResourceAsStream("test.properties");
) {
printProperties(input);
} } public InputStream getResourceAsStream(String resource) {
return getResourceAsStream(null, resource);
} public InputStream getResourceAsStream(ClassLoader classLoader, String resource) {
return getResourceAsStream(resource, getClassLoaders(classLoader));
}
//用5个类加载器一个个查找资源,只要其中任何一个找到,就返回
InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
for (ClassLoader cl : classLoader) {
if (null != cl) {
// try to find the resource as passed
InputStream returnValue = cl.getResourceAsStream(resource); // now, some class loaders want this leading "/", so we'll add it and try again if we didn't find the resource
if (null == returnValue) {
returnValue = cl.getResourceAsStream("/" + resource);
} if (null != returnValue) {
return returnValue;
}
}
}
return null;
} private void printProperties(InputStream input) throws IOException {
Properties properties = new Properties();
properties.load(input);
System.out.println(properties.getProperty("name"));
} //一共5个类加载器
ClassLoader[] getClassLoaders(ClassLoader classLoader) {
return new ClassLoader[]{
classLoader,
defaultClassLoader,
Thread.currentThread().getContextClassLoader(),
getClass().getClassLoader(),
systemClassLoader};
}
}

参考链接:

 

本文主要讲解和总结java读取properties/xml等资源文件的几种方法,以备来日使用时翻阅。无论是Servlet、Struts或者Spring、Hibernate,配置资源文件都是必不可少的一项工作,Java中主要提供了提供了2个类来读取资源文件,一个是Class类,一个是ClassLoader类。我们一步步来分析,要获取一个文件的内容,那第一步肯定是要先获取文件的路径,第二步才是读取文件内容。

     本文地址:http://blog.csdn.net/chen_zw/article/details/18771897

步骤一:获取资源文件路径

java的Web项目结构相信大家应该都很熟悉,它大概是这样的:

如上图所示,它主要分为了3部分,一个是source folder(src目录下),一个是output folder(build目录下),最后一个是deploy path(WebRoot) ,可能大家的命名不一样,但这3部分对应的功能是一致的。想修改这3部分对应的文件目录,可以选中项目,右键选properties,然后选中Java Build Path进行修改,如下图所示:

首先说下source folder目录,这个目录下存放的是项目java源码,也就是可阅读、可编写的代码。而output folder目录则存放着java源码编译后生成的字节码,是.class文格式的,最后是deploy path目录,这是javaWeb项目独有的,主要存放的是Web相关的jar包、配置文件和网页资源等。我们可能将要读取的资源文件放在在source folder(src )或者deploy path(WebRoot )目录下,而两者的读取方式也是不同的。

我们先来看看放在source folder(src )目录下的资源文件如何读取的吧,假设资源文件放置在这里:

  1. public class PropertiesUtil {
  2. /**
  3. * @Description: 我们使用Class.getResourceAsStream(String path)方法来获取资源文件
  4. * @author: chenzw
  5. * @CreateTime: 2014-1-25 下午7:02:40
  6. * @param args
  7. * @throws
  8. */
  9. public static void main(String[] args) {
  10. /* path中不以'/'开头表示该路径是相对路径,相对于当前类所在的目录  */
  11. InputStream is = PropertiesUtil.class.getResourceAsStream("cfg/jdbc.properties");
  12. // 等同于 InputStream is = this.getClass().getResourceAsStream("cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
  13. /* path中以'/'开头表示该路径是绝对路径,相对于classpath的绝对路径 */
  14. InputStream is2 = PropertiesUtil.class.getResourceAsStream("/com/util/cfg/jdbc.properties");
  15. // 等同于 InputStream is2 = this.getClass().getResourceAsStream("/com/util/cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
  16. // 等同于 InputStream is2 = Thread.currentThread().getClass().getResourceAsStream("/com/util/cfg/jdbc.properties");
  17. /* 使用getClassLoader()表示该路径是相对于classpath目录的相对路径*/
  18. InputStream is3 = PropertiesUtil.class.getClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties");
  19. // 等同于 InputStream is3 = this.getClass().getClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties"); --this.getClass()不能在static方法中使用
  20. // 等同于 InputStream is3 = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/util/cfg/jdbc.properties");
  21. //这3种方式获取的资源文件是同一个。
  22. }
  23. }

再来看看放在WebRoot目录下的资源文件是怎么读取的,假设资源文件存放在这里:

步骤二:读取资源文件

  1. package com.util;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5. public class PropertiesUtil {
  6. /**
  7. * @throws IOException
  8. * @Description: 我们使用Class.getResourceAsStream(String path)方法来获取资源文件
  9. * @author: chenzw
  10. * @CreateTime: 2014-1-25 下午7:02:40
  11. * @param args
  12. * @throws
  13. */
  14. public static void main(String[] args) throws IOException {
  15. //资源文件路径的多种获取方法详见步骤一
  16. InputStream is = PropertiesUtil.class.getResourceAsStream("cfg/jdbc.properties");
  17. Properties ps = new Properties();
  18. //加载properties资源文件
  19. ps.load(is);
  20. System.out.println(ps.getProperty("jdbc.url"));
  21. System.out.println(ps.getProperty("jdbc.user"));
  22. System.out.println(ps.getProperty("jdbc.pass"));
  23. }
  24. }
 
 

版权声明:本文为博主原创文章,转载请注明原出处,谢谢!

java 资源文件的读取的更多相关文章

  1. 说说Java中的资源文件的读取

    最近在看spring的资源获取时发现JDK里存在几种不同方式的资源获取,因比较混乱特地总结起来帮助和我一样混乱的人理解.下面是我项目的类结构图,在 src/main/java 下有两个类 Resour ...

  2. java通过文件路径读取该路径下的所有文件并将其放入list中

    java通过文件路径读取该路径下的所有文件并将其放入list中   java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中.假设指定路径为path,目标集合为fileList,遍 ...

  3. 文件_ _android从资源文件中读取文件流并显示的方法

    ======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...

  4. Eclipse打jar包,资源文件的读取

    最近的工作中需要将java程序打一个jar包,然后在Linux中供调用.程序中需要读取一个配置文件.遇到了三个问题.第一个是依赖的第三方Jar包打成Jar包后找不到:第二个问题是资源文件所在的文件夹打 ...

  5. 在eclipse完成对Java_web项目里面资源文件的读取

    Java_web项目的资源文件一般有两种: 一种是存放数据之间有联系的文件,使用xml文件 另一种是存放数据之间没有联系的文件,使用properties文件 这里我们对properties文件读写做示 ...

  6. 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法

      建立好一个Maven项目后,如果Java Resources资源文件下没有src/main/java文件夹,并且在手动创建这个文件时提示“已存在文件”. 这说明,在这个项目配置中已经有了src/m ...

  7. java从文件中读取数据然后插入到数据库表中

    实习工作中,完成了领导交给的任务,将搜集到的数据插入到数据库中,代码片段如下: static Connection getConnection() throws SQLException, IOExc ...

  8. Java对文件的读取方式以及它们的优缺点

    Java常用的对文件的读取方式基本包括: BufferedReader -> readLine(): 按行读取文件,直到读取内容==null FileInputStream -> read ...

  9. 解决Eclipse建立Maven项目后无src/main/java资源文件夹的办法

    建立好一个Maven项目后,如果Java Resources资源文件下没有src/main/java文件夹,并且在手动创建这个文件时提示“已存在文件”.这说明,在这个项目配置中已经有了src/main ...

随机推荐

  1. 快速排序-C

    #include <stdio.h> #include <stdlib.h> #define N 6 int partition(int arr[], int low, int ...

  2. java 环境变量设定

    ​     1   新建系统环境  新建  弹出“新建系统变量”对话框,分别输入变量名“JAVA_HOME”和变量值(java安装路径)“C:\Java\jdk1.7.0_03”,其中变量值是笔者的J ...

  3. bzoj 1026

    很久以前做过的一道数位DP,现在用一种新的解决数位DP的比较一般的方法. 数位DP裸题是:求[L,R]有多少个数. 先转化成求[0,R]有多少个数,然后区间相减即可. 对于[0,R]中的所有数,用0补 ...

  4. 实用在线小工具 -- JS代码压缩工具

        实用在线小工具 -- JS代码压缩工具 将JS代码进行压缩可以减少内存占用,下面链接是一个在线JS代码压缩工具,它将多余的空格和换行符压缩了. JS代码压缩工具链接:http://jspack ...

  5. PAT甲级1107. Social Clusters

    PAT甲级1107. Social Clusters 题意: 当在社交网络上注册时,您总是被要求指定您的爱好,以便找到一些具有相同兴趣的潜在朋友.一个"社会群体"是一群拥有一些共同 ...

  6. PAT甲级1034. Head of a Gang

    PAT甲级1034. Head of a Gang 题意: 警方找到一个帮派的头的一种方式是检查人民的电话.如果A和B之间有电话,我们说A和B是相关的.关系的权重被定义为两人之间所有电话的总时间长度. ...

  7. java.lang.RuntimeException: java.io.IOException: invalid constant type: 15

    java.lang.RuntimeException: java.io.IOException: invalid constant type: 15 controller通过dubbo调用servic ...

  8. 开始整理iOS职位面试问题及答案

    Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接 ...

  9. 《Android传感器高级编程》

    <Android传感器高级编程> 基本信息 原书名:Professional Android Sensor Programming 原出版社: Wrox 作者: (美)米内特(Greg M ...

  10. api的mock开源工具;api文档生成器;api的mock工具;阿里系;其他开源

    django-rest-framework,即drf的api文档,包括自带的文档和其他三方文档,比如swagger.DRF Docs等 https://www.django-rest-framewor ...