FileSystemResource 和 ClassPathResource 以及 ServletContextResource 获取资源用法

FileSystemResource 和 ClassPathResource 是 java 中比较常见的两个获取资源的类。除了他们两个之外,还有一个也比较常用。那就是 ServletContextResource。本文介绍他们三个的用法。

FileSystemResource 是 Spring 提供的资源访问类。FileSystemResource 类相比其他两个资源访问类,没有什么优势,它只是在 File 类的基础上略作封装。

/*默认从文件系统的当前路径加载xttblog.xml资源*/
FileSystemResource fsr = new FileSystemResource("xttblog.xml");

FileSystemResource 实例可使用 FileSystemResource 构造器显示地创建,但更多的时候它都是隐式创建。执行 Spring 的某个方法时,该方法接受一个代表资源路径的字符串参数,当 Spring 识别该字符串参数中包含file:前缀后,系统将会自动创建FileSystemResource 对象。

ClassPathResource 也是 Spring 框架提供的类。利用ClassPathResource读取xml配置的基本思路就是通过构造函数传入的文件路径,接着交给class或者classLoader,调用getResourceAsStream获取到InputStream。

FileSystemResource 和 ClassPathResource 的用法如下:

String filePath = "D:/com/xttblog.txt";
//使用系统文件路径方式加载文件
Resource res1 = new FileSystemResource(filePath);
//使用类路径方式加载文件
Resource res2 = new ClassPathResource("conf/xttblog.txt");
InputStream ins1 = res1.getInputStream();
InputStream ins2 = res2.getInputStream();
getFileName();//获取文件名
getFile();//获取资源对应的File对象
getInputStream();//获取文件的输入流
createRelative(String relativePath);//在相对地址创建新文件

EncodedResource encRes = new EncodedResource(res, "UTF-8");
String content = FileCopyUtils.copyToString(encRes.getReader());

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resources[] = resolver.getResources("classpath*://com/***/*.xml");
For(Resource resource : resources){
   System.out.println(resource.getDescription);
}

ClassPathResource、 FileSystemResource、InputStreamResource、ServletContextResource、 UrlResource 的区别如下:

  • ClassPathResource 从系统的类路径中加载 
  • FileSystemResource 从文件系统加载,比如说自己指定配置文件的全路径 
  • InputStreamResource 从输入流中加载 
  • ServletContextResource 从Servlet 上下文环境中加载 
  • UrlResource 从指定的Url加载

Class.getResource("")获取的是相对于当前类的相对路径。Class.getResource("/")获取的是classpath的根路径。ClassLoader.getResource("")获取的是classpath的根路径。

在创建ClassPathResource对象时,我们可以指定是按Class的相对路径获取文件还是按ClassLoader来获取。

FileSystemResource 效果类似于Java中的File
ClassPathResource 效果类似于this.getClass().getResource("/").getPath();
ServletContextResource 效果类似于request.getServletContext().getRealPath("");

 

上一篇:从Resource下获取图像返回给客户端的几种方法


下一篇:为什么angular library的build不能将assets静态资源打包进去(转)