JAVA如何刪除文件或者文件夾
一、JAVA刪除文件或者空文件夾的四種基本方法
JAVA提供了大量的類來操作IO流,采用裝飾者模式對IO的操作進行層層增強。
File類在JAVA中不僅代表文件還代表目錄的意思。File能夠新建、刪除、重命名文件和目錄。
但是File類功能比較局限,在JAVA 7中新增了java.nio.file包,其中新增了Path、Paths、Files等類用于彌補不足。
File類的delete()
File類的delete方法用于刪除文件或者目錄,如果刪除成功則會返回true,否則返回false。
它無法判斷文件是因為不存在而返回的false,,還是刪除文件失敗而返回的false(文件正在被使用)。
File類的deleteOnExit()
File類的deleteOnExit()方法并不會返回任何信息,以至于我們無法判斷文件狀態(tài)(是否被刪除),因此我們應該避免使用這個方法。
Files類的delete(Path path)
Files這個類是JAVA 7引入用于操作文件的工具類,F(xiàn)iles.delete方法如果刪除文件成功不會返回任何信息,
如果文件不存在則會拋出java.nio.file.NoSuchFileException異常,如果操作刪除的是一個不為空的目錄,則會拋出java.nio.file.DirectoryNotEmptyException異常。推薦使用
Files類的deleteIfExists(Path path)
Files.deleteIfExists方法如果文件刪除成功則返回true,如果文件不存在則返回false。
如果刪除的是一個不為空的目錄則拋出java.nio.file.DirectoryNotEmptyException異常。推薦使用
總結:
- 由上面的總結可以看出,傳統(tǒng)IO方法刪除文件或文件夾,在刪除失敗的時候,最多返回一個false。
- 通過這個false無法發(fā)掘刪除失敗的具體原因,是因為文件本身不存在刪除失???還是文件正在被使用而刪除失?。?/li>
- NIO 的方法在這一點上,就做的比較好,刪除成功或失敗都有具體的返回值或者異常信息,這樣有利于我們在刪除文件或文件夾的時候更好的做程序的異常處理。
二、如何刪除整個目錄或者目錄中的部分文件
在演示如何刪除整個目錄或者目錄中部分文件時,讓我們先談論Files中的walkFileTree方法和FileVisitor接口。
使用FileVistor遍歷文件和目錄
在傳統(tǒng)的JAVA IO操作中,要程序遍歷指定目錄下所有文件和子目錄,一般采用遞歸進行遍歷,這種方式不僅復雜而且靈活性低。
因此JAVA 7提供了Files工具類來幫助我們更好的便利文件和子目錄。
Files類提供了 walkFileTree方法來遍歷文件和子目錄。
這兩個方法都需要FileVistor參數(shù),FileVisitor表示文件訪問器,第一個參數(shù)Path表示開始遍歷的文件路徑,int參數(shù) 表示遍歷的層數(shù)。
walkFileTree方法會自動遍歷Path路徑下的所有文件和子目錄。
遍歷文件和子目錄都會觸發(fā)FileVisitor中的對應方法。
FileVisitor中定義了四個方法:
//訪問子目錄之前觸發(fā)該方法 FileVisitResult postVisitDirectory(T var1, IOException var2) throws IOException; //訪問子目錄后觸發(fā)該方法 FileVisitResult preVisitDirectory(T var1, BasicFileAttributes var2) throws IOException; //訪問file文件時觸發(fā)該方法 FileVisitResult visitFile(T var1, BasicFileAttributes var2) throws IOException; //訪問file文件失敗時觸發(fā)該方法 FileVisitResult visitFileFailed(T var1, IOException var2) throws IOException;
上面四個方法都會返回一個FileVisitResult對象,用于表示訪問后的行為,F(xiàn)ileVisitResult定義了四種行為:
public enum FileVisitResult { CONTINUE, 表示繼續(xù)訪問 TERMINATE, 繼續(xù)訪問,但是不訪問該文件或者該目錄的兄弟文件或目錄 SKIP_SUBTREE,繼續(xù)訪問,但是不再訪問該文件或者該目錄的子目錄 SKIP_SIBLINGS; 終止訪問 private FileVisitResult() { } }
在實際編程運用中,可以通過繼承SimpleFileVisitor來實現(xiàn)自己的文件訪問器,或者重寫SimpleFileVisitor類中的方法來實現(xiàn)自己的需求。
Files.walkFileTree刪除指定文件夾所有文件(代碼演示)
所提供的工具類是刪除指定文件或目錄下所有子目錄或者文件。
如果只刪除部分文件,請重寫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(); } } }
總結
Files提供了大量的文件操作方法,可以滿足大多數(shù)文件操作場景,本文并沒有列出如何刪除指定文件下部分文件或者目錄的操作,其實只需要重寫visitFile方法按自己的規(guī)則編寫就行。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java中使用While語句自增運算遍歷數(shù)組典型實例
這篇文章主要介紹了Java中使用While語句自增運算遍歷數(shù)組典型實例,本文直接給出實例代碼,并對每一句代碼都注解了詳細注釋,需要的朋友可以參考下2015-06-06Java實現(xiàn)XML格式與JSON格式互相轉換的方法
這篇文章主要介紹了Java實現(xiàn)XML格式與JSON格式互相轉換的方法,方法通過實例代碼給大家介紹的非常詳細,選擇使用哪種格式通常取決于項目的需求和上下文,所以格式轉換就成了我們必備的技能,具體實現(xiàn)代碼跟隨小編一起看看吧2023-10-10