Spring的资源访问接口---Resource

2023-11-19

JDK提供的访问资源的类(File等)不能很好满足各种某些资源的访问需求。比如缺少从类路径和Web容器的上下文中获取资源的资源操作类。Spring的Resource接口提供了更好用的资源访问能力。Spring使用Resource访问各种资源文件,配置文件资源,国际化属性资源等。

Resource.java

package org.springframework.core.io;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import org.springframework.core.io.InputStreamSource;

public interface Resource extends InputStreamSource {
    boolean exists();//资源是否存在

    boolean isReadable();

    boolean isOpen();//资源是否打开

    URL getURL() throws IOException;//如果底层资源可以表示成URL,则返回对应的URL对象

    URI getURI() throws IOException;

    File getFile() throws IOException;//如果底层资源是一个文件,则返回对应的File对象

    long contentLength() throws IOException;

    long lastModified() throws IOException;

    Resource createRelative(String var1) throws IOException;

    String getFilename();

    String getDescription();
}

Resource 继承了 InputStreamSource

InputStreamSource .java

package org.springframework.core.io;

import java.io.IOException;
import java.io.InputStream;

public interface InputStreamSource {
    InputStream getInputStream() throws IOException;//返回资源对应的输入流
}

介绍几个最常用的Resource实现类:

  • WritableResource:可写资源接口。两个实现类PathResource和FileSystemResource
  • ClassPathResource:用于加载类路径下的资源
  • FileSystemResource:用于加载文件系统资源,如:D:/conf/test.xml
  • UrlResource:访问任何可以通过URL表示的资源,包括文件系统资源、HTTP资源、FTP资源
  • PathResource:可以访问任何通过URL、Path、系统文件路径表示的资源

资源访问Demo – FileSourceExample .java

package springResources;

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.WritableResource;

import java.io.*;

/**
 * Created by Mistra-WR on 2018/3/18/018.
 */
public class FileSourceExample {
    public static void main(String [] args){
        try {
            String  filePath = "D:/Working/Spring/src/main/resources/conf/resourceFileTest.txt";
            //使用系统文件路径方式加载文件
            WritableResource res1 = new PathResource(filePath);
            //使用类路径方式加载文件
            Resource res2 = new ClassPathResource("conf/resourceFileTest.txt");
            
            EncodedResource encRes = new EncodedResource(res2,"UTF-8");//可以对资源进行特定编码
            File file1 = res1.getFile();//获得File对象
            File file2 = encRes.getResource().getFile();//获得File对象
            
            OutputStream stream1 = res1.getOutputStream();//获取文件输出流
            stream1.write("我是小王瑞".getBytes());
            stream1.close();

            //使用Resource接口读资源文件
            InputStream ins1 = res1.getInputStream();//获取文件输入流
            InputStream ins2 = res2.getInputStream();

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int i;
            while ((i = ins1.read())!=-1){
                baos.write(i);
            }
            System.out.println(baos.toString());

            System.out.println("res1:" + res1.getFilename());//获得文件名
            System.out.println("res2:" + res2.getFilename());
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

资源类型的地址前缀:

  • classpath:classpath:com/smart/beans.xml 从类路径中加载资源
  • file:file:/conf/com/smart/beans.xml UrlResource从文件系统目录中装载资源,可采用绝对或相对路径
  • http://:http://www.smart.com/resource/beans.xml UrlResource从Web服务器中装载资源
  • ftp://:ftp://www/smartcom/resource/beans.xml UrlResource从FTP服务器中装载资源
  • 没有前缀 根据ApplicationContext进行判断采用对应类型的Resource

"classpath:"和"classpath:"的区别*
主要在于多个模块打包的应用时的区别。具体参考:Spring加载resource时classpath*:与classpath:的区别

Ant风格的资源地址匹配符

  • ?:匹配文件名中的一个字符
  • *:匹配文件名中的任意字符
  • ** :匹配多层路径

资源加载Demo – PatternResolverTest .java

package springResources;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.testng.annotations.Test;

/**
 * Created by Mistra-WR on 2018/3/20/020.
 */
public class PatternResolverTest {

    @Test
    public void getResources() throws Throwable{
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        Resource resource[] = resolver.getResources("classpath*:com/smart/**/*.xml");

        for (Resource resource1:resource){
            System.out.println(resource1.getDescription());
        }
    }
}

PathMatchingResourcePatternResolver将扫描虽有类路径下及JAR包中对应com.smart类包下的路径,读取所有以.xml为后缀的文件资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring的资源访问接口---Resource 的相关文章

随机推荐

  • vue中常用的数组方法

    Vue中常用的数组方法 filter map forEach find findIndex some every filter map forEach find findIndex some every filter filter 方法创建
  • OpenMMLab AI实战营第一天笔记

    计算机视觉基础与openmmlab介绍 机器学习和神经网络简介 机器学习基础 机器学习是什么 从数据中学习经验 以解决特定问题 机器学习的典型范式 监督学习 有标签 无监督学习 无标签 强化学习 让智能体自己适应环境 机器学习中的分类问题
  • 联想小新笔记本,16G运行内存只能使用13.9G或14.9G的解决方案

    1 问题描述 我的电脑是联想小新Pro 16 一共有16G的运行内存 但实际情况只能使用13 9G 如下图所示 2 解决方案 这需要进入电脑BIOS 更改配置 1 电脑关机 在开机的时候一直点F2 进入到BIOS模式 并把语言设为中文 2
  • 缺陷管理与测试用例

    一 提交缺陷注意实现 可重现 发现缺陷可以在开发人员的电脑上实现 唯一性 每个缺陷有一个编号 也就是编号的ID 缺陷报告每行是一个缺陷 规范性 提交的缺陷需要符合公司制定的规范要求 缺陷报告的规范 ID 标题 重现步骤 期望结果 实际结果
  • 除了快手与抖音,“云想科技们”也在加速“出圈”

    在电商行业 大家可能听说过传统电商行业的 代运营 现在短视频赛道崛起 代企业运营 以效果为前提 做出符合企业品牌价值好的 新的内容的短视频营销服务商也受到更多关注 云想科技就是其中的代表 在行业新常态下 布局新业务依旧是企业寻求增长新动力的
  • Visual Grounding任务常用数据集介绍RefCOCO、RefCOCO+、RefCOCOg、ReferItGame和Flickr30K Entities

    Visual Grounding任务常用的数据集有五个 RefCOCO RefCOCO RefCOCOg ReferItGame和Flickr30K Entities RefCOCO RefCOCO RefCOCOg 是三个从MSCOCO中
  • linux服务器使用gustat指令查看gpu显卡的使用情况(比nvidia-smi好用)

    使用gpustat指令需要先安装gpustat 安装需要root权限 apt install gpustat 查看gpu使用情况 gpustat nvidia smi gpustat相比于nvidia smi查看的信息更加详细 可以看到使用
  • flex布局宽高度设置不成功

    flex布局中 会出现是在宽高 但是不起作用 那是因为flex布局当不够的时候自动压缩了 可以选择 让其不压缩 flex shrink 0 然后在设置宽高 或者利用复合属性 flex 0 0 83rpx 这篇博客是对flex布局的讲解 以及
  • 如何给证件照换一个背景颜色

    我们在考试报名的时候 经常是不同的考试需要不同的登记照尺寸和背景颜色 但是我们基本上不可能每种颜色的证件照都去拍一张吧 那样也太麻烦成本也太高 所以通过前端实现了一个改变证件照背景颜色的方法 他可以将证件照的背景颜色修改为任意的颜色 而不局
  • 微信小程序支付中的prepay_id获取方法,以及微信支付统一签名算法闭坑

    class Wechat 公众号的或者小程序支付参数 private appId private appSecret 商家的配置信息 private mch id private mch key 回调地址 public notify url
  • 前台与后台数据交互

    后台取到的数据在前台应该用EL表达式显示 xx xx 如果要给前台单选按钮赋值 需要用js进行判断 满足条件后 id attr checked true false 设置选中状态 设置单选按钮及下拉列表不可用是disabled disabl
  • for循环之斐波拉契数列

    题目大意 菲波那契数列是指这样的数列 数列的第一个和第二个数都为1 接下来每个数都等于前面2个数之和 给出一个正整数k 要求菲波那契数列中第k个数是多少 Input 输入一行 包含一个正整数k 1 lt k lt 46 Output 输出一
  • 在C++中调用OpenSSL库进行编程

    目录 OpenSSL简介 下载OpenSSL库并配置实验环境 OpenSSL库的加密函数的认识 使用 EVP 库实现 DES 和 AES 加密 EVP EncryptUpdate 函数参数详解 OpenSSL加密实践 RSA 密钥生成 RS
  • 第一次面试前端实习生心得

    今天第一次去面试前端岗位的实习生 公司规模不算大吧 不过也有好几个部门 说说我的面试心得吧 首先是hr面 如下是她问的问题 学这个多久了 大四还有没有课 是否只需完成毕业设计就行了不用上课 同学暑假都在干嘛 学校课程学了什么 同学们主要找哪
  • (转载)我们需要什么样的字段类型

    数据库定义到char类型的字段时 不知道大家是否会犹豫一下 到底选char nchar varchar nvarchar text ntext中哪一种呢 结果很可能是两种 一种是节俭人士的选择 最好是用定长的 感觉比变长能省些空间 而且处理
  • Java 两种zero-copy零拷贝技术mmap和sendfile的介绍

    详细介绍了两种zero copy零拷贝技术mmap和sendfile的概念和基本原理 目录 1 标准IO 2 零拷贝 2 1 sendfile调用 2 1 mmap调用 2 2 MQ中的应用 1 标准IO 很多软件是基于server cli
  • MES在流程和离散型制造企业的应用存在哪些差别?

    企业的生产方式 主要可以分为按定单生产 按库存生产或上述两者的组合 从生产类型上考虑 则可以分为批量生产和单件小批生产 从产品类型和生产工艺组织方式上 企业的行业类型可分为流程生产行业和离散制造行业 典型的流程生产行业有医药 石油化工 电力
  • C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别 以及在什么时候调用拷贝构造函数 什么情况下调用赋值运算符 最后 简单的分析了下深拷贝和浅拷贝的问题 拷贝构造函数和赋值运算符 在默认情况下 用户没有定义 但是也没有显式的删除 编译器会自动的隐式
  • Direct3D光照

    光照的组成 环境光 这种类型的光经其他表面反射到达物体表面 并照亮整个场景 要想以较低代价粗略模拟这类反射光 环境光是一个很好的选择 漫射光 这种类型光沿着特定的方向传播 当它到达某一表面时 将沿着各个方向均匀反射 无论从哪个方位观察 表面
  • Spring的资源访问接口---Resource

    JDK提供的访问资源的类 File等 不能很好满足各种某些资源的访问需求 比如缺少从类路径和Web容器的上下文中获取资源的资源操作类 Spring的Resource接口提供了更好用的资源访问能力 Spring使用Resource访问各种资源