【IO】Java的getResourceAsStream的用法

1 篇文章 0 订阅

通过Java的getResourceAsStream获取资源主要有以下两种方式:

  1. Class.getClassLoader.getResourceAsStream(String name)
    : 默认是从ClassPath下获取资源,name不能以/开头,代表ClassPath下的相对路径。
  2. Class.getResourceAsStream(String name) : name 不以/开头时默认是从此类所在的包下取资源,以/开头则是从ClassPath下获取。

假设此时在resources目录下有一个file/hello.txt文件,则可通过以下代码来进行获取:

public class App {
    public static void main(String[] args) {
        //通过ClassLoader方式获取不以"/"开头
        InputStream input1 = App.class.getClassLoader().getResourceAsStream("file/hello.txt");
        //通过Class方式则必须以"/"开头
        InputStream input2 = App.class.getResourceAsStream("/file/hello.txt")
    }
}

Class.getClassLoader.getResourceAsStream

Class.getClassLoader.getResourceAsStream(String name)中的name相当于ClassPath下的相对目录,查找时会用ClassPath下的目录加上name来构造资源的URL

使用maven工具打包时,src目录下的代码以及resources目录下的资源默认会打包到target/classes目录下,ClassPath配置时一般会配置.(表示当前目录),即会从当前目录下查找类。

结合以上两点,向Class.getClassLoader.getResourceAsStream方法传入file/hello.txt可以获取到target/classes/file下的hello.txt文件。

Class.getResourceAsStream

Class.getResourceAsStream(String name)中的name若不以/开头,则会从当前类所在的包下获取资源,假设App类的包名为org.example,则解析后的路径为org/example/file/hello.txt,该值会作为Class.getClassLoader.getResourceAsStream(String name)中的参数传入,但默认情况下maven并不会将org.example包下的资源文件打包到target/classes下,因此获取不到对应资源。

Class.getResourceAsStream(String name)的源码如下:

 public InputStream getResourceAsStream(String name) {
    name = resolveName(name);
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
        // A system class.
        return ClassLoader.getSystemResourceAsStream(name);
    }
    return cl.getResourceAsStream(name);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值