日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

發布時間:2023/12/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是Java IO總結系列篇的第4篇,前篇的訪問地址如下:

如果您閱讀完成,覺得此文對您有幫助,請給我點個贊,您的支持是我不竭的創作動力。

為了方便大家理解,我特意制作了本文對應的視頻:總結刪除文件或者文件夾的7種方法

一、刪除文件或文件夾的四種基礎方法

下面的四個方法都可以刪除文件或文件夾,它們的共同點是:當文件夾中包含子文件的時候都會刪除失敗,也就是說這四個方法只能刪除空文件夾。

需要注意的是:傳統IO中的File類和NIO中的Path類既可以代表文件,也可以代表文件夾。

File類的delete()

File類的deleteOnExit()

Files.delete(Path path)

Files.deleteIfExists(Path path);

它們之間的差異:

由上面的對比可以看出,傳統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”結尾的是數據文件,其他的是文件夾

可以使用代面的代碼進行創建

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 SimpleFileVisitor() {

// 先去遍歷刪除文件

@Override

public FileVisitResult visitFile(Path file,

BasicFileAttributes attrs) throws IOException {

Files.delete(file);

System.out.printf("文件被刪除 : %s%n", file);

return FileVisitResult.CONTINUE;

}

// 再去遍歷刪除目錄

@Override

public FileVisitResult postVisitDirectory(Path dir,

IOException exc) throws IOException {

Files.delete(dir);

System.out.printf("文件夾被刪除: %s%n", dir);

return FileVisitResult.CONTINUE;

}

}

);

}

下面的輸出體現了文件的刪除順序

文件被刪除 : D:\data\test1\test2\test2.log

文件被刪除 : D:\data\test1\test2\test3\test3.log

文件夾被刪除 : D:\data\test1\test2\test3\test4\test5

文件夾被刪除 : D:\data\test1\test2\test3\test4

文件夾被刪除 : D:\data\test1\test2\test3

文件夾被刪除 : D:\data\test1\test2

我們既然可以遍歷出文件夾或者文件,我們就可以在處理的過程中進行過濾。比如:

按文件名刪除文件或文件夾,參數Path里面含有文件或文件夾名稱

按文件創建時間、修改時間、文件大小等信息去刪除文件,參數BasicFileAttributes 里面包含了這些文件信息。

2.2.Files.walk

如果你對Stream流語法不太熟悉的話,這種方法稍微難理解一點,但是說實話也非常簡單。

使用Files.walk遍歷文件夾(包含子文件夾及子其文件),遍歷結果是一個Stream

對每一個遍歷出來的結果進行處理,調用Files.delete就可以了。

@Test

void testDeleteFileDir6() throws IOException {

createMoreFiles();

Path path = Paths.get("D:\\data\\test1\\test2");

try (Stream walk = Files.walk(path)) {

walk.sorted(Comparator.reverseOrder())

.forEach(DeleteFileDir::deleteDirectoryStream);

}

}

private static void deleteDirectoryStream(Path path) {

try {

Files.delete(path);

System.out.printf("刪除文件成功:%s%n",path.toString());

} catch (IOException e) {

System.err.printf("無法刪除的路徑 %s%n%s", path, e);

}

}

問題:怎么能做到先去刪除文件,再去刪除文件夾? 。 利用的是字符串的排序規則,從字符串排序規則上講,“D:\data\test1\test2”一定排在“D:\data\test1\test2\test2.log”的前面。所以我們使用“sorted(Comparator.reverseOrder())”把Stream順序顛倒一下,就達到了先刪除文件,再刪除文件夾的目的。

下面的輸出,是最終執行結果的刪除順序。

刪除文件成功:D:\data\test1\test2\test3\test4\test5

刪除文件成功:D:\data\test1\test2\test3\test4

刪除文件成功:D:\data\test1\test2\test3\test3.log

刪除文件成功:D:\data\test1\test2\test3

刪除文件成功:D:\data\test1\test2\test2.log

刪除文件成功:D:\data\test1\test2

2.3.傳統IO-遞歸遍歷刪除文件夾

傳統的通過遞歸去刪除文件或文件夾的方法就比較經典了

//傳統IO遞歸刪除

@Test

void testDeleteFileDir7() throws IOException {

createMoreFiles();

File file = new File("D:\\data\\test1\\test2");

deleteDirectoryLegacyIO(file);

}

private void deleteDirectoryLegacyIO(File file) {

File[] list = file.listFiles(); //無法做到list多層文件夾數據

if (list != null) {

for (File temp : list) { //先去遞歸刪除子文件夾及子文件

deleteDirectoryLegacyIO(temp); //注意這里是遞歸調用

}

}

if (file.delete()) { //再刪除自己本身的文件夾

System.out.printf("刪除成功 : %s%n", file);

} else {

System.err.printf("刪除失敗 : %s%n", file);

}

}

需要注意的是:

listFiles()方法只能列出文件夾下面的一層文件或文件夾,不能列出子文件夾及其子文件。

先去遞歸刪除子文件夾,再去刪除文件夾自己本身

歡迎關注我的博客,里面有很多精品合集

本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客。

覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注。

總結

以上是生活随笔為你收集整理的java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。