<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Spring內建的工具類裡,最喜歡用的就是檔案讀寫這一部分,雖然原生的寫法也沒幾句,但是就是懶,不想回圈、判斷什麼的,直接呼叫現成的靜態方法,多高效,哈哈,這就是懶人必備。
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); }
前面之所以先說一下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); }
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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45