1. 程式人生 > >總結刪除檔案或資料夾的7種方法-JAVA IO基礎總結第4篇

總結刪除檔案或資料夾的7種方法-JAVA IO基礎總結第4篇

![](https://img2020.cnblogs.com/other/1815316/202009/1815316-20200901144138715-236578077.png) 本文是Java IO總結系列篇的第4篇,前篇的訪問地址如下: * [總結java中建立並寫檔案的5種方式-JAVA IO基礎總結第一篇](http://www.zimug.com/java/%e6%80%bb%e7%bb%93java%e4%b8%ad%e5%88%9b%e5%bb%ba%e5%b9%b6%e5%86%99%e6%96%87%e4%bb%b6%e7%9a%84%e4%ba%94%e7%a7%8d%e6%96%b9%e5%bc%8f-java-io%e5%9f%ba%e7%a1%80%e6%80%bb%e7%bb%93%e7%ac%ac%e4%b8%80/.html) * [總結java從檔案中讀取資料的6種方法-JAVA IO基礎總結第二篇](http://www.zimug.com/java/%e6%80%bb%e7%bb%93java%e4%bb%8e%e6%96%87%e4%bb%b6%e4%b8%ad%e8%af%bb%e5%8f%96%e6%95%b0%e6%8d%ae%e7%9a%846%e7%a7%8d%e6%96%b9%e6%b3%95-java-io%e5%9f%ba%e7%a1%80%e6%80%bb%e7%bb%93%e7%ac%ac%e4%ba%8c/.html) * [總結java建立資料夾的4種方法及其優缺點-JAVA IO基礎總結第三篇](http://www.zimug.com/java/%e6%80%bb%e7%bb%93java%e5%88%9b%e5%bb%ba%e6%96%87%e4%bb%b6%e5%a4%b9%e7%9a%844%e7%a7%8d%e6%96%b9%e6%b3%95%e5%8f%8a%e5%85%b6%e4%bc%98%e7%bc%ba%e7%82%b9-java-io%e5%9f%ba%e7%a1%80%e6%80%bb%e7%bb%93/.html) **如果您閱讀完成,覺得此文對您有幫助,請給我點個贊,您的支援是我不竭的創作動力。** > 為了方便大家理解,我特意製作了本文對應的視訊:[總結刪除檔案或者資料夾的7種方法](https://www.bilibili.com/video/BV1zA411n7ZH) ## 一、刪除檔案或資料夾的四種基礎方法 下面的四個方法都可以刪除檔案或資料夾,它們的共同點是:**當資料夾中包含子檔案的時候都會刪除失敗,也就是說這四個方法只能刪除空資料夾**。 > 需要注意的是:傳統IO中的File類和NIO中的Path類既可以代表檔案,也可以代表資料夾。 * File類的delete() * File類的deleteOnExit() * Files.delete(Path path) * Files.deleteIfExists(Path path); 它們之間的差異: ![](https://img2020.cnblogs.com/other/1815316/202009/1815316-20200901144138957-1569891242.png) * 由上面的對比可以看出,傳統IO方法刪除檔案或資料夾,再刪除失敗的時候,最多返回一個false。通過這個false無法發掘刪除失敗的具體原因,是因為檔案本身不存在刪除失敗?還是資料夾不為空導致的刪除失敗? * NIO 的方法在這一點上,就做的比較好,刪除成功或失敗都有具體的返回值或者異常資訊,這樣有利於我們在刪除檔案或資料夾的時候更好的做程式的異常處理 * 需要注意的是傳統IO中的deleteOnExit方法,筆者覺得應該避免使用它。它永遠只返回void,刪除失敗也不會有任何的Exception丟擲,所以我建議不要用,以免在你刪除失敗的時候沒有任何的響應,而你可能誤以為刪除成功了。 ~~~ //false只能告訴你失敗了 ,但是沒有給出任何失敗的原因 @Test void testDeleteFileDir1() { File file = new File("D:\\data\\test"); boolean deleted = file.delete(); System.out.println(deleted); } //void ,刪除失敗沒有任何提示,應避免使用這個方法,就是個坑 @Test void testDeleteFileDir2() { File file = new File("D:\\data\\test1"); file.deleteOnExit(); } //如果檔案不存在,丟擲NoSuchFileException //如果資料夾裡面包含檔案,丟擲DirectoryNotEmptyException @Test void testDeleteFileDir3() throws IOException { Path path = Paths.get("D:\\data\\test1"); Files.delete(path); //返回值void } //如果檔案不存在,返回false,表示刪除失敗(檔案不存在) //如果資料夾裡面包含檔案,丟擲DirectoryNotEmptyException @Test void testDeleteFileDir4() throws IOException { Path path = Paths.get("D:\\data\\test1"); boolean result = Files.deleteIfExists(path); System.out.println(result); } ~~~ 歸根結底,建議大家使用java NIO的`Files.delete(Path path)`和`Files.deleteIfExists(Path path);`進行檔案或資料夾的刪除。 ## 二、如何刪除整個目錄或者目錄中的部分檔案 上文已經說了,那四個API刪除資料夾的時候,如果資料夾包含子檔案,就會刪除失敗。那麼,如果我們確實想刪除整個資料夾,該怎麼辦? ### 前提準備 為了方便我們後面進行試驗,先去建立這樣一個目錄結構,“.log”結尾的是資料檔案,其他的是資料夾 ![](https://img2020.cnblogs.com/other/1815316/202009/1815316-20200901144139177-316436347.png) 可以使用代面的程式碼進行建立 ~~~ private void createMoreFiles() throws IOException { Files.createDirectories(Paths.get("D:\\data\\test1\\test2\\test3\\test4\\test5\\")); Files.write(Paths.get("D:\\data\\test1\\test2\\test2.log"), "hello".getBytes()); Files.write(Paths.get("D:\\data\\test1\\test2\\test3\\test3.log"), "hello".getBytes()); } ~~~ ### 2.1. walkFileTree與FileVisitor * 使用walkFileTree方法遍歷整個檔案目錄樹,使用FileVisitor處理遍歷出來的每一項檔案或資料夾 * FileVisitor的visitFile方法用來處理遍歷結果中的“檔案”,所以我們可以在這個方法裡面刪除檔案 * FileVisitor的postVisitDirectory方法,注意方法中的“post”表示“後去做……”的意思,所以用來**檔案都處理完成之後再去處理資料夾**,所以使用這個方法刪除資料夾就可以有效避免資料夾內容不為空的異常,因為在去刪除資料夾之前,該資料夾裡面的檔案已經被刪除了。 ~~~ @Test void testDeleteFileDir5() throws IOException { createMoreFiles(); Path path = Paths.get("D:\\data\\test1\\test2"); Files.walkFileTree(path, new SimpleFil