首頁 > 軟體

Springboot工具類FileCopyUtils使用教學

2022-12-31 14:01:58

前言

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:Usersadmin
    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);
}

到此這篇關於Springboot工具類FileCopyUtils使用教學的文章就介紹到這了,更多相關Springboot FileCopyUtils內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com