java 读取resource下的文件信息

39 篇文章 1 订阅

Classloader是从classpath中读取资源的一个类,一般我们用classloader来加载class,实际上,但凡是处在classpath中的文件,我们称之为资源,都可以用classloader来读取。

在java中的API里,有两种方式来使用classpath读取资源。

Java代码 

 收藏代码

  1. System.out.println(Bootstrap.class.getResource(""));  
  2. System.out.println(Bootstrap.class.getResource("/"));  
  3. System.out.println(Bootstrap.class.getClassLoader().getResource(""));  
  4. System.out.println(Bootstrap.class.getClassLoader().getResource("/"));  
  5. System.out.println(Bootstrap.class.getResource("name.properties"));  
  6. System.out.println(Bootstrap.class.getResource("/name.properties"));  
  7. System.out.println(Bootstrap.class.getClassLoader().getResource("name.properties"));  



class里有一个getResource方法,classloader类里也有getResource方法,这两种API都可以从classpath中读取资源,但是也有一些区别。

class的getResource方法实际上也是用classloader来读取资源,但是起始路径不一样

Java代码 

 收藏代码

  1. System.out.println(Bootstrap.class.getResource(""));  


这个API的起始路径是当前类的路径,如果要正确的读到资源,目标资源必须和当前class在同一级,或子目录里,可以用相对路径读取到。

Java代码 

 收藏代码

  1. System.out.println(Bootstrap.class.getResource("/"));  
  2. System.out.println(Bootstrap.class.getClassLoader().getResource(""));  


加上/的读取方式,和调用classloader读取是同一个效果,这个读取代表的是某个classpath下的根路径。
 

Java代码 

 收藏代码

  1. System.out.println(Bootstrap.class.getClassLoader().getResource("/"));  


这是一种错误的读取方式,使用classloader的时候,不可以指定/来读取。

例:

Java代码 

 收藏代码

  1. System.out.println(Bootstrap.class.getResource("name.properties"));  
  2. System.out.println(Bootstrap.class.getResource("/name.properties"));  
  3. System.out.println(Bootstrap.class.getClassLoader().getResource("name.properties")  


第一种读取,代表读取当前类同一级的文件name.properties
第二种和第三种读取等效,都是读取任意classpath根路径下的name.properties文件

Remark
在启动服务的时候,所有的依赖项都是以目录的形式存在在classpath下,这样classloader才能一个一个去加载,而getResource的API里的路径,也都是相对于每一个依赖的目录的路径

 

 

具体读写demo如下:

package com.crgt.gtdata.utils;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Properties;

/**
 * @Author: wpp
 * @Date: 2020/4/17 15:05
 */
public  class JavaConfUtil {
    /**
     *cache缓存
     */
    static  HashMap<String, Properties> cache   = new HashMap<String,Properties>();

    /**
     * 加载配置文件,默认先读取缓存中配置
     * @param filePath
     * @return
     */

    public  static Properties loadProperties2(String filePath  ){

        if (filePath != null && filePath != ""){

            Properties props  = new Properties();
            InputStream inputStream  = JavaConfUtil.class.getResourceAsStream(filePath);

            try {
                if (inputStream == null) {
                    return null;
                }
                props.load(inputStream);
                return props;
            }catch (Exception e){
                    e.printStackTrace();
            }
        }
        return null;
    }
    
    public static Boolean getIsProd(){
        String res = loadProperties2("/config/config.properties").getProperty("isProd");
        System.out.println(res);
        return  false;
    }

    public static void main(String[] args) {
        System.out.println(JavaConfUtil.class.getResource("/config/config.properties"));
        System.out.println(getIsProd());
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值