spring3笔记4-Resource资源访问

来源:互联网 发布:mac谷歌浏览器无法登录 编辑:程序博客网 时间:2024/05/01 19:29

JDK提供的访问资源的类(如:java.net.URL、File等)

//访问classpath中的资源URL resourceUrl = getClassLoader().getResource("java/lang/String.class");//取得URLInputStream resourceContent = getClassLoader().getResourceAsStream("java/lang/String.class");// 取得输入流//访问文件系统中的资源File resourceFile = new File("C:\\test.txt"); //取得File对象InputStream resourceContent =new FileInputStream(resourceFile);// 取得输入流//访问Web应用中的资源URL resourceURL = servletContext.getResource("/WEB-INF/web.xml");// 取得URLInputStream resourceContent = servletContext.getResourceAsStream("/WEB-INF/web.xml");// 取得输入流//访问Jar/Zip文件中的资源URL jarURL =new File(System.getProperty("java.home") + "/lib/rt.jar").toURI().toURL();URL resourceURL =new URL("jar:" + jarURL + "!/java/lang/String.class");// 取得URLInputStream resourceContent = resourceURL.openStream();// 取得输入流这些并不能很好的满足各种底层的资源访问需求,比如缺少从类路径或者Web容器的上下文中获取资源的操作类,因此spring设计一个Resource接口。


Resource接口:

Resource接口的实现类:

ByteArrayResource:二进制数组表示的资源,二进制数组资源可以在内存中通过程序构造

ClassPathResource:类路径下的资源,资源以相对于类路径的方式表示,相对路径

FileSystemResource:文件系统资源,资源以文件系统路径的方式表示,绝对路径

InputStreamResource:对应一个InputStream的资源

ServletContextResource:为访问Web容器上下文中的资源而设计的类,负责以相对于Web应用根目录的路径加载资源,它支持以流和URL的方式访问,在WAR解压的情况下,也可以通过File的方法访问,该类还可以直接从jar包中直接访问资源

UrlResource:封装了 java.net.URL,它使用户能够访问任何可以通过URL表示的资源,如文件系统的资源、HTTP资源、FTP资源

DescriptiveResource:暂无介绍

PortletContextResource:暂无介绍

接口实现详情看资源:http://doc.okbase.net/zrtqsk/archive/105869.html


Resource接口的主要方法:

boolean exists():资源是否存在

boolean isOpen():资源是否打开

URL getURL() throws IOException:如果底层资源可以表示成URL,该方法返回对应的URL对象

File getFile() throws IOException:如果底层资源对应一个文件,该方法返回对应的File对象

InputStream getInutStream() throws IOException:返回资源对应的输入流


spring的Resource接口及其实现类可以脱离spring框架的情况下使用,它比通过JDK访问资源的API更好用,更强大

使用实例

(文件位于Web应用的类路径下)String filePath = "D:/springTest/chapter3/WebRoot/WEB-INF/classes/conf/file.txt";//使用系统文件路径方式加载文件Resource res1 = new FileSystemResource(filePath);//使用类路径方式加载文件Resource res2 = new ClassPathResource("conf/file.txt");//以相对Web应用根目录的方式进行访问Resource res3 = new ServletContextResource(application, "/WEB-INF/classes/conf/file.txt");//获取文件名String fileName = res1.getFilename(); <==>String fileName = res2.getFilename(); <==>String fileName = res3.getFilename();(文件位于远程服务器:Web服务器或FTP服务器)//使用UrlResource访问远程文件Resource res = new UrlResource(url);//对访问到的文件编码EncodedResource encRes = newEncodedResource (res, "UTF-8");//读取文件资源的路径String content = FileCopyUtils.copyToString(encRes.getReader());


spring支持的资源类型的地址前缀:

地址前缀示例对应资源类型classpath:classpath:com/taobao/spring/spring-mvc.xml从类路径中加载资源,classpath: 等价于 classpath:/ ,都是相对于类的根路径。资源文件可以在标准的文件系统中,也可以在jar或zip的类包中file:file:/conf/com/taobao/spring/spring-mvc.xml使用UrlResource从文件系统目录中装载资源,也可以采用绝对或相对路径http://http://www.taobao.com/resources/spring-mvc.xml使用UrlResource从文件系统目录中装载资源ftp://ftp://www.taobao.com/resources/spring-mvc.xml使用UrlResource从文件系统目录中装载资源无前缀com/taobao/spring/spring-mvc.xml根据ApplicationContext具体实现类采用对应的类型的Resource


classpath: 与 classpath*:前缀相比,如果有多个JAR包或文件系统都拥有相同的包名时,classpath:只会加载一个包下面的资源,classpath*:则会加载所有该包名对应包下的文件


Ant风格资源地址支持三种匹配符:

匹配符解释示例可匹配实例?匹配文件名中的一个字符classpath:com/spring/t?st.xmlcom/spring/test.xml;
com/spring/tast.xml;
com/spring/tpst.xml*匹配文件名中任意个字符
classpath:com/spring/t*st.xmlclasspath:com/spring/teast.xml;
classpath:com/spring/tedavst.xml;**匹配多层路径classpath:com/spring/**/*.xml匹配com.spring下任何xml文件
com/spring/springFramework/abc.xml;
com/spring/xxxx/mvf.xml

资源加载器ResourceLoader:

相关子类:ResourcePatternResolver:不支持Ant风格的资源路径表达式PathMatchingResourcePatternResolver:支持Ant风格的资源路径表达式,继承ResourcePatternResolver实例:ResourcePatternResolver resolver = newPathMatchingResourcePatternResolver();//加载com.spring包以及其子包中所有xml文件资源Resource[] resources = resolver.getResource("classpath*:com/spring/**/*.xml");for(Resource record resources){System.out.println(record.getDescription());}






原创粉丝点击