本文共 3044 字,大约阅读时间需要 10 分钟。
最近在看Spring的源代码,里面有好多地方都用到了Class和ClassLoader类的getResource方法来加载资源文件。之前对这两个类的这个方法一知半解,概念也很模糊,这边做下整理,加深理解。
访问资源的主要方式
在Java中,通常可以通过以下方式来访问资源:
在使用中,Class可通过直接引用类的class属性而获得,或是通过实例的getClass()方法来获取。获取ClassLoader的方式则比较多,常见以下几种:
Class.getResource 与 ClassLoader.getResource 的区别
两者最大的区别,是从哪里开始寻找资源。
正确使用getResource方法
在实际开发过程中建议使用Class.getResource这个方法,但如果你想获取批量资源,那么就必须使用到ClassLoader的getResources()方法。
避免使用Class.getResource("/")或ClassLoader.getResource("")。你应该传入一个确切的资源名,然后对输出结果作计算。
如果要定位与某个类同一个包的资源,尽量使用那个类的getResource方法并使用相对路径。
如果对ClassLoader不太了解,那就尽量使用Class的getResource方法。
如果不理解或无法确定该传给Class.getResource方法的相对路径,那就以类路径的顶层包路径为参考起点,总是传给它以"/"开头的路径吧。
不要假设你的调试环境就是最后的运行环境。你的代码可能不打包,也可能打包,你得考虑这些情况,不要埋坑。
获取批量资源
使用ClassLoader的getResources方法可以获取批量资源。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();Enumerationresources = classLoader.getResources("META-INF/MANIFEST.MF");
Spring的ResourceLoader
在Spring框架中,ResourceLoader和ResourcePatternResolver接口封装了获取资源的方法,我们可以直接拿来使用。ResourceUtils这个类中提供了很多判断资源类型的工具方法,可以直接使用。
//前面三种的写法效果是一样的,必须从classpath基准目录开始写精确的匹配路径ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.spring.xml");ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/beans.spring.xml");ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:/beans.spring.xml");ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:/beans.spring.xml"); ResourceLoader接口
ResourcePatternResolver接口——重点给出一个例子:
String txt = "";ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources("templates/layout/email.html");Resource resource = resources[0];//获取文件流,因为在jar文件中,不能直接通过文件资源路径拿到文件,但是可以在jar包中拿到文件流InputStream stream = resource.getInputStream();StringBuilder buffer = new StringBuilder();byte[] bytes = new byte[1024];try { for (int n; (n = stream.read(bytes)) != -1; ) { buffer.append(new String(bytes, 0, n)); }} catch (IOException e) { e.printStackTrace();}txt = buffer.toString(); ResourceUtils
ResourcePatternUtils转载地址:http://ucpez.baihongyu.com/