Springboot工具类FileCopyUtils使用教程
作者:凡夫贩夫 发布时间:2023-10-15 18:56:36
前言
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下的自定义配置文件,下面是两个我常用的方法:
booleanexists(),用于判断资源是否存在;
@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(Filein),把文件读入到字节数组中
byte[]copyToByteArray(InputStreamin),从输入流中读入到字节数组中
输出
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(Filein)和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);
}
来源:https://blog.csdn.net/fox9916/article/details/128334822


猜你喜欢
- EventBus 可以很方便地进行各组件间的通信,解耦性更强,比广播更好用。EventBus 3 简介EventBus是一种为了优化Andr
- 何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的事物却是我们经常使用到的。只要我们的函
- @FeignClient()注解的使用由于SpringCloud采用分布式微服务架构,难免在各个子模块下存在模块方法互相调用的情况。比如se
- 本文实例讲述了C#实现在Form里面内嵌dos窗体的方法。分享给大家供大家参考。具体如下:using System;using System
- 一、介绍本教程将介绍如何使用 mybatis-plus 工具自动给我们生成 Controller、Service、Entity、Mapper
- 栈和队列:都是线性表,都是基于List基础上的实现线性表:数组,链表,字符串,栈,队列元素按照一条“直线&rdq
- 下面提供三种计时器的写法供大家参考,大家可以自行选择自己钟爱的使用。写法一(Spring 包提供的计时器):import java.text
- 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:第一种:通过注解@PostConstruct 和 @
- 用Java编写简单的五子棋,供大家参考,具体内容如下前言这两天在空闲时间做了个五子棋项目,分享给大家看一下,界面是这样的:界面很丑我知道,本
- 一、设置Jackson序列化时只包含不为空的字段new ObjectMapper().setSerializationInclusion(I
- @Value从Nacos配置中心获取值并自动刷新在使用Nacos作为配置中心时,除了@NacosValue可以做到自动刷新外,nacos-s
- 本文实例分析了C#中float的取值范围和精度。分享给大家供大家参考。具体分析如下:float类型的表现形式:默认情况下,赋值运算符右侧的实
- RESTful 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设
- 前言图形相交检测常常用在伤害判定,使用自定义的图形相交检测,可以在一定程度上控制性能。比如2D格斗游戏中使用的矩形包围盒(AABB),一些动
- 前言今天我们来讨论一下,程序中的错误处理。在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避
- 1. 准备工作需要提前安装好Elasticsearch,访问地址:http://127.0.0.1:9200/ 得到以下结果,得到clust
- springboot集成开发实现商场秒杀加入主要依赖<dependency> <groupId>org.spring
- 本文实例讲述了Android简单实现启动画面的方法。分享给大家供大家参考,具体如下:核心代码:package com.demo.app;im
- 本文实例讲述了Android的三种菜单。分享给大家供大家参考。具体分析如下:Android的菜单分为三种类型:选项菜单(Option Men
- 返回json格式数据时间格式配置数据库里面查出来的时间是时间错格式,前段需要处理才能展示相应的格式,自己一个个转的话太麻烦,所以可以在apl