一、使用Class类提供的AIP。
Class的实例对象方法:
getClass().getResourceAsStream("xml/mybatis.xml");
ClassLoader的实例对象方法:
this.classLoader.getResourceAsStream("xml/mybatis.xml");
ClassLoader的静态方法:
ClassLoader.getSystemResourceAsStream("xml/mybatis.xml");
以上三种方法都是classpath下获取文件。
经过测试getClass().getResourceAsStream方法无法获取InputStream。查看此方法上的注释说明的很清楚:与给定类相关联的资源的搜索规则是由该类的定义类装入器实现的。这种方法委托给这个对象的类装入器。如果这个对象是由引导类装入器装入的,那么该方法委托给ClassLoader.getSystemResourceAsStream。
所以如果运行getClass().getResourceAsStream方法对应的ClassLoader不是xml/mybatis.xml文件的载入者的话是获取不到InputStream的。
二、使用spring resource接口类
其实spring framework中的Resource接口对各种资源文件的加载进行了封装,所以编程时优先考虑使用spring 中的resource接口类。以下对实现Resource接口的常用类如何获取InputStream进行说明。
1、ClassPathResource类getInputStream()方法对以上三种方法都进行了封装和判断。
2、FileUrlResource类getInputStream()方法是通过父类UrlResource调用来实现的。传入的路径为非classpath路径。
3、PathResource类getInputStream()方法指定了通过Files.newInputStream(this.path)获取。传入的路径为非classpath路径。
4、FileSystemResource类getInputStream()方法指定的是操作系统级路径inputStream获取方式。
关于spring framework中resource接口实现还有很多,这里不再依依列出,具体使用方式需要时查阅API即可。
总结:涉及到资源相关的操作优先考虑使用spring中的resource接口。
网友评论