Springboot工具類(lèi)FileCopyUtils使用教程
前言
Spring內(nèi)置的工具類(lèi)里,最喜歡用的就是文件讀寫(xiě)這一部分,雖然原生的寫(xiě)法也沒(méi)幾句,但是就是懶,不想循環(huán)、判斷什么的,直接調(diào)用現(xiàn)成的靜態(tài)方法,多高效,哈哈,這就是懶人必備。
Resource
Spring中主要通過(guò)org.springframework.core.io.Resource接口描述一個(gè)文件資源的位置信息,其常用的實(shí)現(xiàn)類(lèi)有四個(gè),分別是FileSystemResource、UrlResource、ClassPathResource、ServletContextResource。
FileSystemResource描述文件資源的絕對(duì)路徑,如D:\...;
UrlResource描述資源的一個(gè)網(wǎng)絡(luò)位置,即URL資源,如如 file://... http://...;
ClassPathResource描述的類(lèi)路徑下的資源位置,如classpth:...;
ServletContextResource描述的Web容器上下文中的資源位置。下圖這三個(gè)類(lèi)關(guān)系:

在實(shí)際的業(yè)務(wù)開(kāi)發(fā)中,根據(jù)操作資源時(shí)所處的場(chǎng)景,從實(shí)現(xiàn)類(lèi)FileSystemResource、UrlResource、ClassPathResource、ServletContextResource中選擇合適的實(shí)現(xiàn)類(lèi),進(jìn)行相應(yīng)的操作。我在項(xiàng)目里經(jīng)常操作classpath下的自定義配置文件,下面是兩個(gè)我常用的方法:
booleanexists(),用于判斷資源是否存在;
@Test
public void test1() throws IOException {
//在與application.properties同級(jí)的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對(duì)象;
@Test
public void test2() throws IOException {
//在與application.properties同級(jí)的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);
}這里要稍微拐個(gè)彎,說(shuō)一個(gè)計(jì)算資源描述中兩個(gè)經(jīng)常傻傻分不清楚的東西:URL和URI。
URI統(tǒng)一資源標(biāo)識(shí)符,用一個(gè)緊湊一些的字符串標(biāo)標(biāo)識(shí)資源,或者通俗理解為URL的父類(lèi),URL是URI的子類(lèi)。
URL統(tǒng)一資源定位符,主要用于網(wǎng)絡(luò)資源的訪問(wèn),其中關(guān)鍵的屬性有 protocol(通信協(xié)議)、host(主機(jī)ip)、port(端口)、path(路徑);
@Test
public void test4() throws IOException {
//百度上隨便找了一個(gè)圖片的地址
URL url = new URL("https://z3.ax1x.com/2021/09/28/4fzZV0.md.jpg");
InputStream inputStream = url.openStream();
//用戶(hù)當(dāng)前工作目錄,即當(dāng)前項(xiàng)目的根目錄,
//“user.home”是用戶(hù)根目錄,即用戶(hù)在操作系統(tǒng)的根目錄,即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 {
//百度上隨便找了一個(gè)圖片的地址
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
前面之所以先說(shuō)一下Resource,是因?yàn)橐獙?shí)現(xiàn)文件的讀寫(xiě),必然要對(duì)文件本身進(jìn)行一些包裝,即用程度代碼來(lái)描述一下文件,Resource的不同實(shí)現(xiàn)類(lèi),其實(shí)質(zhì)就是對(duì)不同場(chǎng)景下文件資源的更具體的描述。FileCopyUtils和StreamUtils中封裝了具體讀寫(xiě)的靜態(tài)方法。
org.springframework.util.FileCopyUtils:
輸入
byte[]copyToByteArray(Filein),把文件讀入到字節(jié)數(shù)組中
byte[]copyToByteArray(InputStreamin),從輸入流中讀入到字節(jié)數(shù)組中
輸出
void copy(byte[] in, File out),把字節(jié)數(shù)組寫(xiě)到文件中。
int copy(File in, File out),從寫(xiě)入文件寫(xiě)出到輸出文件里。
void copy(byte[] in, OutputStream out),從字節(jié)數(shù)組讀取到輸出流。
int copy(InputStream in, OutputStream out),從輸入流寫(xiě)出到輸出流。
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同級(jí)的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差不多,有點(diǎn)不太明白,為什么封裝了兩個(gè)?有人知道原因的,評(píng)論區(qū)告訴我唄,一塊學(xué)習(xí)一下。

@Test
public void test6() throws IOException {
//在與application.properties同級(jí)的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);
}到此這篇關(guān)于Springboot工具類(lèi)FileCopyUtils使用教程的文章就介紹到這了,更多相關(guān)Springboot FileCopyUtils內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)給出分?jǐn)?shù)數(shù)組得到對(duì)應(yīng)名次數(shù)組的方法
這篇文章主要介紹了java實(shí)現(xiàn)給出分?jǐn)?shù)數(shù)組得到對(duì)應(yīng)名次數(shù)組的方法,涉及java針對(duì)數(shù)組的遍歷、排序及運(yùn)算的相關(guān)技巧,需要的朋友可以參考下2015-07-07
Java線(xiàn)程生命周期及轉(zhuǎn)換過(guò)程
這篇文章主要介紹了Java線(xiàn)程生命周期及轉(zhuǎn)換過(guò)程,線(xiàn)程的生命周期指的是線(xiàn)程從創(chuàng)建到銷(xiāo)毀的整個(gè)過(guò)程初始狀態(tài)、可運(yùn)行狀態(tài)、運(yùn)行狀態(tài)、休眠狀態(tài)、終止?fàn)顟B(tài),更多詳細(xì)介紹,需要的小伙伴可以參考下面文章內(nèi)容2022-05-05
Runtime.getRuntime().exec 路徑包含空格的解決
這篇文章主要介紹了Runtime.getRuntime().exec 路徑包含空格的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
解決mybatis使用char類(lèi)型字段查詢(xún)oracle數(shù)據(jù)庫(kù)時(shí)結(jié)果返回null問(wèn)題
這篇文章主要介紹了mybatis使用char類(lèi)型字段查詢(xún)oracle數(shù)據(jù)庫(kù)時(shí)結(jié)果返回null問(wèn)題的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
微服務(wù)SpringBoot整合Jasypt加密工具的場(chǎng)景分析
Jasypt是Java加密工具包,能支持對(duì)密碼的哈希加密,對(duì)文本和二進(jìn)制數(shù)據(jù)的對(duì)稱(chēng)加解密,還能集成SpringBoot項(xiàng)目對(duì)配置文件中的密鑰進(jìn)行加密存儲(chǔ),這篇文章主要介紹了微服務(wù)SpringBoot整合Jasypt加密工具,需要的朋友可以參考下2022-10-10
java使用@Scheduled注解執(zhí)行定時(shí)任務(wù)
這篇文章主要給大家介紹了關(guān)于java使用@Scheduled注解執(zhí)行定時(shí)任務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Java中文件寫(xiě)入內(nèi)容的幾種常見(jiàn)方法
本文主要介紹了Java中文件寫(xiě)入內(nèi)容的幾種常見(jiàn)方法,主要包括使用NIO的Files工具類(lèi)、通過(guò)commons-io的FileUtils工具類(lèi)、RandomAccessFile、PrintWriter和BufferedWriter這幾種,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn)
這篇文章主要介紹了Java Swing GridBagLayout網(wǎng)格袋布局的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

