JAVA如何刪除文件或者文件夾
一、JAVA刪除文件或者空文件夾的四種基本方法
JAVA提供了大量的類(lèi)來(lái)操作IO流,采用裝飾者模式對(duì)IO的操作進(jìn)行層層增強(qiáng)。
File類(lèi)在JAVA中不僅代表文件還代表目錄的意思。File能夠新建、刪除、重命名文件和目錄。
但是File類(lèi)功能比較局限,在JAVA 7中新增了java.nio.file包,其中新增了Path、Paths、Files等類(lèi)用于彌補(bǔ)不足。
File類(lèi)的delete()
File類(lèi)的delete方法用于刪除文件或者目錄,如果刪除成功則會(huì)返回true,否則返回false。
它無(wú)法判斷文件是因?yàn)椴淮嬖诙祷氐膄alse,,還是刪除文件失敗而返回的false(文件正在被使用)。
File類(lèi)的deleteOnExit()
File類(lèi)的deleteOnExit()方法并不會(huì)返回任何信息,以至于我們無(wú)法判斷文件狀態(tài)(是否被刪除),因此我們應(yīng)該避免使用這個(gè)方法。
Files類(lèi)的delete(Path path)
Files這個(gè)類(lèi)是JAVA 7引入用于操作文件的工具類(lèi),F(xiàn)iles.delete方法如果刪除文件成功不會(huì)返回任何信息,
如果文件不存在則會(huì)拋出java.nio.file.NoSuchFileException異常,如果操作刪除的是一個(gè)不為空的目錄,則會(huì)拋出java.nio.file.DirectoryNotEmptyException異常。推薦使用
Files類(lèi)的deleteIfExists(Path path)
Files.deleteIfExists方法如果文件刪除成功則返回true,如果文件不存在則返回false。
如果刪除的是一個(gè)不為空的目錄則拋出java.nio.file.DirectoryNotEmptyException異常。推薦使用
總結(jié):
- 由上面的總結(jié)可以看出,傳統(tǒng)IO方法刪除文件或文件夾,在刪除失敗的時(shí)候,最多返回一個(gè)false。
- 通過(guò)這個(gè)false無(wú)法發(fā)掘刪除失敗的具體原因,是因?yàn)槲募旧聿淮嬖趧h除失???還是文件正在被使用而刪除失???
- NIO 的方法在這一點(diǎn)上,就做的比較好,刪除成功或失敗都有具體的返回值或者異常信息,這樣有利于我們?cè)趧h除文件或文件夾的時(shí)候更好的做程序的異常處理。
二、如何刪除整個(gè)目錄或者目錄中的部分文件
在演示如何刪除整個(gè)目錄或者目錄中部分文件時(shí),讓我們先談?wù)揊iles中的walkFileTree方法和FileVisitor接口。
使用FileVistor遍歷文件和目錄
在傳統(tǒng)的JAVA IO操作中,要程序遍歷指定目錄下所有文件和子目錄,一般采用遞歸進(jìn)行遍歷,這種方式不僅復(fù)雜而且靈活性低。
因此JAVA 7提供了Files工具類(lèi)來(lái)幫助我們更好的便利文件和子目錄。
Files類(lèi)提供了 walkFileTree方法來(lái)遍歷文件和子目錄。
這兩個(gè)方法都需要FileVistor參數(shù),FileVisitor表示文件訪問(wèn)器,第一個(gè)參數(shù)Path表示開(kāi)始遍歷的文件路徑,int參數(shù) 表示遍歷的層數(shù)。
walkFileTree方法會(huì)自動(dòng)遍歷Path路徑下的所有文件和子目錄。
遍歷文件和子目錄都會(huì)觸發(fā)FileVisitor中的對(duì)應(yīng)方法。
FileVisitor中定義了四個(gè)方法:
//訪問(wèn)子目錄之前觸發(fā)該方法 FileVisitResult postVisitDirectory(T var1, IOException var2) throws IOException; //訪問(wèn)子目錄后觸發(fā)該方法 FileVisitResult preVisitDirectory(T var1, BasicFileAttributes var2) throws IOException; //訪問(wèn)file文件時(shí)觸發(fā)該方法 FileVisitResult visitFile(T var1, BasicFileAttributes var2) throws IOException; //訪問(wèn)file文件失敗時(shí)觸發(fā)該方法 FileVisitResult visitFileFailed(T var1, IOException var2) throws IOException;
上面四個(gè)方法都會(huì)返回一個(gè)FileVisitResult對(duì)象,用于表示訪問(wèn)后的行為,F(xiàn)ileVisitResult定義了四種行為:
public enum FileVisitResult { CONTINUE, 表示繼續(xù)訪問(wèn) TERMINATE, 繼續(xù)訪問(wèn),但是不訪問(wèn)該文件或者該目錄的兄弟文件或目錄 SKIP_SUBTREE,繼續(xù)訪問(wèn),但是不再訪問(wèn)該文件或者該目錄的子目錄 SKIP_SIBLINGS; 終止訪問(wèn) private FileVisitResult() { } }
在實(shí)際編程運(yùn)用中,可以通過(guò)繼承SimpleFileVisitor來(lái)實(shí)現(xiàn)自己的文件訪問(wèn)器,或者重寫(xiě)SimpleFileVisitor類(lèi)中的方法來(lái)實(shí)現(xiàn)自己的需求。
Files.walkFileTree刪除指定文件夾所有文件(代碼演示)
所提供的工具類(lèi)是刪除指定文件或目錄下所有子目錄或者文件。
如果只刪除部分文件,請(qǐng)重寫(xiě)visitFile方法規(guī)則。
代碼如下:
/** * @Author: Greyfus * @Create: 2022-06-26 19:24 * @Version: * @Description: */ package com.file.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; public class FileUtils { private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class); /** * 刪除指定文件夾下文件 * * @param filePath */ public static void deleteFolders(String filePath) { Path path = Paths.get(filePath); try { Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException { Files.delete(file); LOGGER.info("刪除文件: {}", file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); LOGGER.info("文件夾被刪除: {}", dir); return FileVisitResult.CONTINUE; } }); } catch (IOException e) { e.printStackTrace(); } } }
總結(jié)
Files提供了大量的文件操作方法,可以滿(mǎn)足大多數(shù)文件操作場(chǎng)景,本文并沒(méi)有列出如何刪除指定文件下部分文件或者目錄的操作,其實(shí)只需要重寫(xiě)visitFile方法按自己的規(guī)則編寫(xiě)就行。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
CountDownLatch和Atomic原子操作類(lèi)源碼解析
這篇文章主要為大家介紹了CountDownLatch和Atomic原子操作類(lèi)的源碼解析以及理解應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03詳解java中Reference的實(shí)現(xiàn)與相應(yīng)的執(zhí)行過(guò)程
不知道大家知不知道特殊的reference對(duì)象都是被jvm專(zhuān)門(mén)處理的,所以這篇文章就相應(yīng)的工作流程和referencequeue之間的協(xié)作進(jìn)行梳理.有需要的朋友們可以參考借鑒。2016-09-09Java項(xiàng)目實(shí)現(xiàn)尋找迷宮出路
這篇文章主要為大家詳細(xì)介紹了Java項(xiàng)目實(shí)現(xiàn)尋找迷宮出路,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05java線(xiàn)程池參數(shù)舉例詳解(附詳細(xì)代碼)
這篇文章主要介紹了Java線(xiàn)程池的工作原理、構(gòu)造方法和關(guān)鍵參數(shù),它還提供了線(xiàn)程池的工作流程、常用線(xiàn)程池實(shí)現(xiàn)及參數(shù)優(yōu)化建議,幫助開(kāi)發(fā)者更好地管理和優(yōu)化線(xiàn)程池,需要的朋友可以參考下2025-02-02MyBatis-Plus 與Druid 數(shù)據(jù)源操作
SpringBoot框架集成MyBatis-Plus和Druid數(shù)據(jù)源,簡(jiǎn)化了數(shù)據(jù)操作與監(jiān)控,MyBatis-Plus作為MyBatis的增強(qiáng)工具,自動(dòng)實(shí)現(xiàn)CRUD操作,減少手寫(xiě)SQL,提供分頁(yè)、邏輯刪除等功能,本文介紹MyBatis-Plus & Druid 數(shù)據(jù)源總結(jié),感興趣的朋友一起看看吧2024-09-09詳解Java中字符串緩沖區(qū)StringBuffer類(lèi)的使用
StringBuffer與String類(lèi)似,只不過(guò)StringBuffer在進(jìn)行字符串處理時(shí)不生成新的對(duì)象,下面我們就來(lái)詳解Java中字符串緩沖區(qū)StringBuffer類(lèi)的使用:2016-06-06Spring boot jpa 刪除數(shù)據(jù)和事務(wù)管理的問(wèn)題實(shí)例詳解
這篇文章主要介紹了Spring boot jpa 刪除數(shù)據(jù)和事務(wù)管理的問(wèn)題實(shí)例詳解,涉及業(yè)務(wù)場(chǎng)景的一些知識(shí)和遇到的的問(wèn)題,需要的朋友可以參考。2017-09-09spring mvc實(shí)現(xiàn)登錄賬號(hào)單瀏覽器登錄
這篇文章主要為大家詳細(xì)介紹了spring mvc實(shí)現(xiàn)登錄賬號(hào)單瀏覽器登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04解決Eclipse打開(kāi).java文件異常,提示用系統(tǒng)工具打開(kāi)的問(wèn)題
這篇文章主要介紹了解決Eclipse打開(kāi).java文件異常,提示用系統(tǒng)工具打開(kāi)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01