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("");