java 资源文件的读取

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 )目录下的资源文件如何读取的吧,假设资源文件放置在这里:

[java] view plain copy

  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目录下的资源文件是怎么读取的,假设资源文件存放在这里:

步骤二:读取资源文件

[java] view plain copy

  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. }

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

时间: 2024-10-09 13:43:03

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

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

最近在看spring的资源获取时发现JDK里存在几种不同方式的资源获取,因比较混乱特地总结起来帮助和我一样混乱的人理解.下面是我项目的类结构图,在 src/main/java 下有两个类 ResourceTest.java和Resource.java ,resources 目录下有两个资源文件 request.xml 和 conf/sysConf.json ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ ├── com │ │ │ │ ├──

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

======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private void doRaw(){ InputStream is = this.getResources().openRawResource(R.raw.ziliao); try{ doRead(is); }catch(IOException e){ e.printStackTrace(); } } pri

文件操作 - Windows资源文件的读取

=============== Windows资源文件的读取 =============== Windows资源操作函数 12 LoadAccelerators 加载快捷键资源 14 LoadBitmap 加载位图资源 16 LoadCursor 加载光标资源 18 LoadIcon 加载图标资源 20 LoadMenu 加载菜单资源 22 LoadString 加载字符串资源 Windows资源操作函数 29 FindResource 从指定模块中加载指定名称.类型的资源 31 SizeofR

android txt文件读写(读取资源文件,读取私有和SD文件的方法)

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import org.apache.http.util.EncodingUtils; import android.app.Activity; public class FileAccess { /** * 一.私有文件夹下的文件存取(/data/data/包名/files) * * @param fileNam

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

建立好一个Maven项目后,如果Java Resources资源文件下没有src/main/java文件夹,并且在手动创建这个文件时提示“已存在文件”. 这说明,在这个项目配置中已经有了src/main/java这个文件夹,至于为什么不显示,我暂时也还不清楚,希望谁明白了跟我下,谢了.(已解决) 第一种方法: 打开项目的classpath文件:如下 <?xml version="1.0" encoding="UTF-8"?><classpath&g

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

建立好一个Maven项目后,如果Java Resources资源文件下没有src/main/java文件夹,并且在手动创建这个文件时提示"已存在文件".这说明,在这个项目配置中已经有了src/main/java这个文件夹. 解决方法: 在项目上右键选择properties,然后点击java build path,在Librarys下,编辑JRE system Library,配置JDK路径.

Web工程下资源文件的读取

servlet中资源文件的读取 方法一:获取资源文件的数据流 ServletContext context = this.getServletContext(); InputStream is = context.getResourceAsStream("/person.properties"); Properties pt = new Properties(); pt.load(is); System.out.println(pt.getProperty("name&quo

解决 IDEA 中src下xml等资源文件无法读取的问题

该问题的实质是,idea对classpath的规定. 在eclipse中,把资源文件放在src文件夹下,是可以找到的: 但是在idea中,直接把资源文件放在src文件夹下,如果不进行设置,是不能被找到的. 下面说说几种解决方法,网上说的都很混乱,我这里做一个总结:推荐方法4 1.将所有资源文件放在resources文件夹下 这样做很方便,比较容易想到,但是层次性就很差了,比如mybatis的映射配置文件mapper.xml,本来需要放在特定的包里面,与dao层,service层等层次为同一个层级

java 中文件的读取File、以及相对路径的问题

内容转自: https://blog.csdn.net/fk1778770286/article/details/53900636 1 Properties properties = new Properties(); 2 InputStream is = DBUtils.class.getResourceAsStream("jdbc.properties"); 以下写法,从class根目录查找文件 1 Properties properties= new Properties();