Springboot内置的工具类之FileCopyUtils

news2024/11/25 20:00:02

前言

        Spring内置的工具类里,最喜欢用的就是文件读写这一部分,虽然原生的写法也没几句,但是就是懒,不想循环、判断什么的,直接调用现成的静态方法,多高效,哈哈,这就是懒人必备。

Resource

        Spring中主要通过org.springframework.core.io.Resource接口描述一个文件资源的位置信息,其常用的实现类有四个,分别是FileSystemResource、UrlResource、ClassPathResource、ServletContextResource。

FileSystemResource描述文件资源的绝对路径,如D:\...;

UrlResource描述资源的一个网络位置,即URL资源,如如 file://... http://...;

ClassPathResource描述的类路径下的资源位置,如classpth:...;

ServletContextResource描述的Web容器上下文中的资源位置。下图这三个类关系:

 

        在实际的业务开发中,根据操作资源时所处的场景,从实现类FileSystemResource、UrlResource、ClassPathResource、ServletContextResource中选择合适的实现类,进行相应的操作。我在项目里经常操作classpath下的自定义配置文件,下面是两个我常用的方法:

boolean exists(),用于判断资源是否存在;

@Test
public void test1() throws IOException {
    //在与application.properties同级的resources目录下放置一张照片"zhangsan.jpeg"
    ClassPathResource classPathResource = new ClassPathResource("zhangsan.jpeg");
    boolean exists = classPathResource.exists();
    Assert.isTrue(exists, "zhangsan资源不存在");
    ClassPathResource classPathResource2 = new ClassPathResource("zhangsan2.jpeg");
    boolean exists2 = classPathResource2.exists();
    Assert.isTrue(exists2, "zhangsan2资源不存在");
}

InputStream getInputStream(),可以从资源中获得InputStream对象;

@Test
public void test2() throws IOException {
    //在与application.properties同级的resources目录下放置一张照片"zhangsan.jpeg"
    ClassPathResource classPathResource = new ClassPathResource("zhangsan.jpeg");
    InputStream inputStream = classPathResource.getInputStream();
    String userDir = System.getProperty("user.dir");
    File file = new File(userDir + File.separator +"zhangsan2.jpeg");
    FileCopyUtils.copy(FileCopyUtils.copyToByteArray(inputStream), file);
}

这里要稍微拐个弯,说一个计算资源描述中两个经常傻傻分不清楚的东西:URL和URI。

URI统一资源标识符,用一个紧凑一些的字符串标标识资源,或者通俗理解为URL的父类,URL是URI的子类。

URL统一资源定位符,主要用于网络资源的访问,其中关键的属性有 protocol(通信协议)、host(主机ip)、port(端口)、path(路径);

@Test
public void test4() throws IOException {
    //百度上随便找了一个图片的地址
    URL url = new URL("https://z3.ax1x.com/2021/09/28/4fzZV0.md.jpg");
    InputStream inputStream = url.openStream();
    //用户当前工作目录,即当前项目的根目录,
    //“user.home”是用户根目录,即用户在操作系统的根目录,即C:\Users\admin
    String userDir = System.getProperty("user.dir");
    File file = new File(userDir + File.separator + "aaa.jpg");
    FileCopyUtils.copy(FileCopyUtils.copyToByteArray(inputStream), file);
}
@Test
public void test5() throws IOException, URISyntaxException {
    //百度上随便找了一个图片的地址
    URI uri = new URI("https://z3.ax1x.com/2021/09/28/4fzZV0.md.jpg");
    InputStream inputStream = uri.toURL().openStream();
    String userDir = System.getProperty("user.dir");
    File file = new File(userDir + File.separator + "aaa2.jpg");
    FileCopyUtils.copy(FileCopyUtils.copyToByteArray(inputStream), file);
}

FileCopyUtils

        前面之所以先说一下Resource,是因为要实现文件的读写,必然要对文件本身进行一些包装,即用程度代码来描述一下文件,Resource的不同实现类,其实质就是对不同场景下文件资源的更具体的描述。FileCopyUtils和StreamUtils中封装了具体读写的静态方法。

org.springframework.util.FileCopyUtils:

输入

byte[] copyToByteArray(File in),把文件读入到字节数组中

byte[] copyToByteArray(InputStream in),从输入流中读入到字节数组中

输出

void copy(byte[] in, File out),把字节数组写到文件中。

int copy(File in, File out),从写入文件写出到输出文件里。

void copy(byte[] in, OutputStream out),从字节数组读取到输出流。

int copy(InputStream in, OutputStream out),从输入流写出到输出流。

int copy(Reader in, Writer out),从输入流到输出流。

void copy(String in, Writer out),从字符串到输出流。

        我最喜欢用的是byte[] copyToByteArray(File in)和void copy(byte[] in, File out):

@Test
public void test2() throws IOException {
    //在与application.properties同级的resources目录下放置一张照片"zhangsan.jpeg"
    ClassPathResource classPathResource = new ClassPathResource("zhangsan.jpeg");
    InputStream inputStream = classPathResource.getInputStream();
    String userDir = System.getProperty("user.dir");
    File file = new File(userDir + File.separator +"zhangsan2.jpeg");
    byte[] bytes = FileCopyUtils.copyToByteArray(inputStream);
    FileCopyUtils.copy(bytes, file);
}

StreamUtils

        org.springframework.util.StreamUtils,和FileCopyUtils差不多,有点不太明白,为什么封装了两个?有人知道原因的,评论区告诉我呗,一块学习一下。

 

@Test
public void test6() throws IOException {
     //在与application.properties同级的resources目录下放置一张照片"zhangsan.jpeg"
    ClassPathResource classPathResource = new ClassPathResource("zhangsan.jpeg");
    InputStream inputStream = classPathResource.getInputStream();
    String userDir = System.getProperty("user.dir");
    FileOutputStream fileOutputStream = new FileOutputStream(userDir + File.separator + "zhangsan3.jpeg");
    StreamUtils.copy(inputStream, fileOutputStream);
}

嗨,小伙伴,都看到这了,说明这篇文章对你很用嘛,收藏+关注,不迷路哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE5——动画混合(2)

一、引言 接上文《UE5——动画混合》,UE5还提供了 遮罩混合、惯性化两种混合,下面将讲述这两种动画混合方式 二、UE5上实现 1、遮罩混合 遮罩混合与《UE5——动画混合》中的 “骨骼的分层混合” 的运行逻辑其实是的一样的。相比起 “骨骼的分层混合”…

【SpringBoot+MyBatis】二级缓存以及使用Redis缓存数据

在MyBatis中,存在一级缓存以及二级缓存。一级缓存是默认自动开启,而二级缓存需要我们手动去开启。但看到这篇文章的人,大部分都是在做项目才发现的问题:每次访问数据都要查询一遍又一遍的数据库,这是在控制台上可以发现…

叶酸偶联N-季铵化壳聚糖(FA-HTCC)

叶酸偶联N-季铵化壳聚糖(FA-HTCC) 中文名称:叶酸偶联N-季铵化壳聚糖 英文名称:FA-HTCC 纯度:95% 存储条件:-20C,避光,避湿 外观:固体或粘性液体 包装:瓶装/袋装 溶解性:溶于大…

MYSQL 主从复制 --- binlog

一个MYSQL数据库存在的问题 在谈主从复制之前,应该都会有一个疑问,那么就是一个MYSQL数据库存在的问题呢? 1. 读和写所有压力都由一台数据库承担,压力大 2. 数据库服务器磁盘损坏则数据丢失,单点故障 为了解决我们可以…

Spark RDD介绍

RDD 引出问题 Spark是如何将多台机器上的数据通过一个类型来关联实现的? 答:通过RDD类型来实现关联 一、RDD简介 RDD(Resilient Distributed Dataset):弹性分布式数据集 RDD的本质: 一个抽象的逻辑上的…

项目运行久了很卡,手动执行垃圾回收机制,秒丝滑

问题 当项目运行久了,内存会被大量占用。如何不重启项目,释放内存,继续丝滑开发呢? 回答 手动执行垃圾回收机制 打开任务管理器康康: 巨卡,无敌卡,解决它! 打开命令行工具&…

Kaggle竞赛——Titanic泰坦尼克之灾(保姆级基础版)

Kaggle竞赛网址:https://www.kaggle.com/c/titanic 本次Kaggle泰坦尼克之灾分析过程大致分为: 第1步:了解数据 第2步:分析数据之间的关系 第3步:缺失项数据处理 第4步:特征因子化 第5步:处理特…

DBCO-SS-活性酯|DBCO-SS-NHS酯

DBCO-SS-活性酯|DBCO-SS-NHS酯 名称;DBCO-SS-活性酯|DBCO-SS-NHS酯 CAS NO:1435934-53-4 分子量:565.66 分子式:C28H27N3O6S2 含 量:>95% 外 观:固体粉末 保存:-20避光避湿 结构式: …

记录--手把手带你开发一个uni-app日历插件(并发布)

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 相信我们在开发各类小程序或者H5,甚至APP时,会把uni-app作为一个技术选型,其优点在于一键打包多端运行,较为强大的跨平台的性能。但是,只要开…

我为什么建议前端将Python 作为第二语言?

前言 “如何摆脱不停切图的困局?” 这不是一篇制造焦虑的文章,而是充满真诚建议的Python推广文。 当谈论到编程入门语言时,大多数都会推荐Python和JavaScript。 实际上,两种语言在方方面面都非常强大。 而如今我们熟知的ES6语…

用Java语言简单实现:炸金花,不知道你有没有兴趣跟着笔者来研究一下呀

说实话,到目前为止,笔者学习Java语言也有着进两个多月了吧!!但是,一直毫无进度!博客更新的也很少,仅仅10篇刚出头,而且浏览量也很少,这样很不符合我的气质!&a…

汉字风格迁移----FtransGAN

🚀针对的问题 以前的大多数作品都是通过将给定子集的风格转移到未见子集的内容来解决这个问题的。然而,他们只关注同一语言中的字体样式转换。在许多任务中,我们需要学习一种语言的字体信息,然后将其应用到其他语言。现有的方法很难完成这样的任务。 图1。几个应用实例。…

03_2排序算法:快速排序、归并排序

开始系统学习算法啦!为后面力扣和蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括概念,算法运行过程,以及代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私信博…

IIS2MDCTR传感器规格、ISM303DACTR磁力计应用、STPSC20H12WL二极管特点

IIS2MDC 3轴数字式磁性传感器具有高达50高斯的磁场动态范围以及16位数据输出。IIS2MDC设有I2C串行总线接口,可支持标准模式 (100kHz)、快速模式 (400kHz)、快速模式 (1MHz) 以及高速模式 (3.4MHz)。 该传感器还设有SPI串行标准接口,另外对其进行配置后可…

IBPS低代码产品公司流辰信息:用心研发,不负众望!

作为一家低代码产品公司,流辰信息一直以高标准严格要求自己,努力研发,努力提升服务品质,从专业的角度为中大型企业数字化转型积极赋能,共创价值。 IBPS低代码开发产品是流辰信息努力研发的硕果,是满足企业级…

教材推荐网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 高校教材推介交流平台的开发主要功能教师发布课程名称、用书信息,各出版社推荐样 书(线上&#…

CRTO 考试总结

写在最前:欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里:https://discord.gg/9XvvuFq9Wb 一起进步,一起 NB~ 背景 今天我结束了 Zero Point Security RTO I 的考试。证书到手。 Zero Point Security 是一家 Base 在英国的安全…

知乎zse-96算法-js补环境方案

文章目录 1. js代码定位与抠取2. 初步分析 开始补环境3. 完整的补全环境的js整合4. 编写python代码调用测试1. js代码定位与抠取 抠js和上篇jsrpc方案一样,传送门:知乎zse-96算法-jsrpc方案 这里简单提一下 直接进入encrypt方法里, 往上先把整个方法体给扣下来: "u…

c语言教工工资管理系统课程设计

序 言 借助现代信息技术和管理理论,建立学校管理信息系统势在必行。对学校而言,全面开发和应用计算机管理信息系统就是有必要的。在学校管理中,教师是学校的宝贵资源,也是学校的“生命线”,因此人事管理是学校的计算机…

JAVA中生成随机数Random VS ThreadLocalRandom性能比较

前言 大家项目中如果有生成随机数的需求,我想大多都会选择使用Random来实现,它内部使用了CAS来实现。 实际上,JDK1.7之后,提供了另外一个生成随机数的类ThreadLocalRandom,那么他们二者之间的性能是怎么样的呢&#x…