美文网首页
统一资源访问Resource

统一资源访问Resource

作者: 喏喏2021 | 来源:发表于2022-02-08 16:54 被阅读0次

    1. 资源的种类

    1)文件资源,比如操作系统的文件
    2)程序资源,比如二进制数据、输入流资源、类路径下的资源
    3)网络资源,比如http资源、ftp资源等

    2. spring资源抽象Resource

    资源种类比较多,不能进行资源的统一操作使用,这样spring为我们抽象出了Resource接口,
    它可以代表各类资源,并提供了统一的方法


    Resource接口方法.png

    我们一般常用的方法都有,看着是不是有点眼熟
    这些其实主要实现呢,是在AbstractResource这个抽象类里,它实现了Resource接口
    而大部分的具体资源类呢,是继承了AbstractResource抽象类,主要的一些具体资源类如下:


    详细资源类.png
    比如主要有如下一些:
    1)数组资源 ByteArrayResource
    2)编码资源 EncodedResource

    3)文件系统资源 FileSystemResource
    4)输入流资源 InputStreamResource
    5)网络、系统资源 UrlResource
    可以看一下简单使用:

    package basic.resource;
    
    import java.io.IOException;
    
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    import org.springframework.core.io.UrlResource;
    import org.springframework.core.io.support.EncodedResource;
    import org.springframework.util.FileCopyUtils;
    
    public class ResourceTest {
        public static void main(String[] args) throws IOException {     
            //url资源读取内容
            Resource r1 = new UrlResource("https://www.jianshu.com/p/5c5cacf9c762");
            EncodedResource er = new EncodedResource(r1, "utf-8");
            String content = FileCopyUtils.copyToString(er.getReader());
            System.out.println("内容:" + content);
            
            //读取类路径资源
            Resource r2 = new ClassPathResource("application.properties");
            System.out.println("文件名:" + r2.getFilename());
            System.out.println("文件长度:" + r2.contentLength() + "字节");
            System.out.println("文件最后修改:" + r2.lastModified());
        }
    }
    //输出:
    内容(内容较长,截取一点):<!DOCTYPE html>
    <html data-n-head-ssr lang="zh-CN" data-n-head="lang">
      <meta name="applicable-device" content="pc,mobile">
    文件名:application.properties
    文件长度:342
    文件最后修改:1643547826422
    

    3. 资源加载ResourceLoader

    上面是统一抽象了,但还需要知道具体的实现类,有点讨厌,spring当然也为了抽象了资源加载ResourceLoader,当然还有一些扩展接口ResourcePatternResolver,可以支持ant风格的资源表达方式,并且还提供了一个标准实现类,PathMatchingResourcePatternResolver
    简单看一个示例:
    这个是我们的文件目录


    本地文件目录.png

    这个是我们的读取代码:

    PathMatchingResourcePatternResolver rpr = new PathMatchingResourcePatternResolver();
    Resource[] rs = rpr.getResources("file:D:/临时文件/a/a/2*.txt");
    for(Resource r : rs) {
    System.out.println(r.getFilename() + "," + r.lastModified());
    //输出
    2.txt,1644309349718
    22.txt,1644309367446
    

    这里我们读取了本地系统目录,以2开头的文件
    细心的你,应该看到文件路径前加了file:标识,表示是一个文件系统目录资源,而不是类路径下的资源,

    主要的资源前缀有如下:
    classpath:

    从类路径下加载资源,可以以/开头,也可以不需要,资源文件可以在jar或是zip的类包中

    file:

    从文件目录加载资源

    http:

    从web服务器加载资源

    ftp:

    从ftp服务器加载资源

    前面提到,还有一个ant风格的地址形式,比如:

    classpath*:com/my/**/a/*/b?c*.xml,
    

    这里?表示单个字符,*任意多个字符,**匹配多层路径
    它能表示哪些路径资源呢?欢迎您的回复!-_-

    相关文章

      网友评论

          本文标题:统一资源访问Resource

          本文链接:https://www.haomeiwen.com/subject/mcibkrtx.html