JAVAファイルまたはフォルダーを削除する


1. JAVA でファイルまたは空のフォルダーを削除する 4 つの基本的な方法

JAVA は IO ストリームを操作するための多数のクラスを提供し、デコレーター モードを採用して IO 操作をレイヤーごとに強化します。File クラスはファイルを表すだけでなく、JAVA のディレクトリも表します。ファイルは、ファイルとディレクトリを作成、削除、名前変更できます。ただし、File クラスの機能は比較的限られており、JAVA 7 では java.nio.file パッケージが追加され、その不足を補うために Path、Paths、Files などの新しいクラスが追加されました。

Fileクラスのdelete()

File クラスの delete メソッドは、ファイルまたはディレクトリを削除するために使用され、削除が成功した場合は true を返し、失敗した場合は false を返します。ファイルが存在しないために false を返すのか、ファイルの削除に失敗した (ファイルが使用中である) 場合に false を返すのかはわかりません。

File クラスの deleteOnExit()

File クラスの deleteOnExit() メソッドは情報を返さないため、ファイルの状態 (削除されたかどうか) を判断できないため、このメソッドの使用は避けるべきです。

Filesクラスのdelete(Pathパス)

Files クラスは、ファイルを操作するために JAVA 7 で導入されたツール クラスです。ファイルが正常に削除された場合、Files.delete メソッドは何も情報を返しません。ファイルが存在しない場合は、java.nio.file.NoSuchFileException がスローされます。空ではないディレクトリを削除する操作の場合、java.nio.file.DirectoryNotEmptyException がスローされます。推奨される使用方法

Files クラスの deleteIfExists(Path パス)

Files.deleteIfExists メソッドは、ファイルが正常に削除された場合は true を返し、ファイルが存在しない場合は false を返します。削除されたディレクトリが空でない場合は、java.nio.file.DirectoryNotEmptyException がスローされます。推奨される使用方法

要約する

上記の概要から、従来の IO メソッドがファイルまたはフォルダーを削除する場合、削除が失敗すると、最大 1 つの false が返されることがわかります。このfalseでは削除失敗の具体的な原因は分かりませんが、ファイル自体に削除失敗がないためでしょうか?それともファイルが使用中で削除に失敗したのでしょうか?この時点では NIO メソッドの方が優れており、削除の成功または失敗に関する特定の戻り値または例外情報があり、ファイルまたはフォルダーを削除するときにプログラムで例外をより適切に処理するのに役立ちます。

2. ディレクトリ全体またはディレクトリ内の一部のファイルを削除する方法

ディレクトリ全体またはディレクトリ内の一部のファイルを削除する方法を説明するときは、最初にwalkFileTreeメソッドとFilesの FileVisitorインターフェイスについて説明します。

FileVistor を使用してファイルとディレクトリを走査する

従来のJAVA IO操作では、プログラムは指定されたディレクトリの下にあるすべてのファイルとサブディレクトリを走査する必要があり、再帰的走査が一般的に使用されますが、この方法は複雑であるだけでなく、柔軟性も低いです。したがって、JAVA 7 では、ファイルとサブディレクトリの処理を容易にするファイルツール クラスが提供されています。Filesクラスは、ファイルとサブディレクトリを走査するためのwalkFileTreeメソッドを提供します。
ここに画像の説明を挿入
どちらのメソッドもFileVistorパラメータを必要とし、FileVisitor はファイル訪問者を示し、最初のパラメータPathは走査を開始するファイル パスを示し、intパラメータは走査するレイヤーの数を示します。walkFileTreeメソッドは、Path の下にあるすべてのファイルとサブディレクトリを自動的に走査します。ファイルとサブディレクトリを走査すると、FileVisitorの対応するメソッドがトリガーされます。
FileVisitorには 4 つのメソッドが定義されています。

//访问子目录之前触发该方法
FileVisitResult postVisitDirectory(T var1, IOException var2) throws IOException;
//访问子目录后触发该方法
FileVisitResult preVisitDirectory(T var1, BasicFileAttributes var2) throws IOException;
//访问file文件时触发该方法
FileVisitResult visitFile(T var1, BasicFileAttributes var2) throws IOException;
//访问file文件失败时触发该方法
FileVisitResult visitFileFailed(T var1, IOException var2) throws IOException;

上記の 4 つのメソッドは、訪問後の動作を表すFileVisitResultオブジェクトを返します。FileVisitResult は 4 つの動作を定義します。

public enum FileVisitResult {
    
    
    CONTINUE, 表示继续访问
    TERMINATE, 继续访问,但是不访问该文件或者该目录的兄弟文件或目录
    SKIP_SUBTREE,继续访问,但是不再访问该文件或者该目录的子目录
    SKIP_SIBLINGS; 终止访问

    private FileVisitResult() {
    
    
    }
}

実際のプログラミングでは、SimpleFileVisitor を継承して独自に実装すること文件访问器も、独自のニーズを実現するために SimpleFileVisitor クラスのメソッドを書き直すこともできます。

Files.walkFileTree は、指定されたフォルダー内のすべてのファイルを削除します (コードデモ)

提供されるツール クラスは、指定されたファイルまたはディレクトリの下にあるすべてのサブディレクトリまたはファイルを削除します。ファイルの一部のみを削除する場合は、visitFileメソッド ルールをオーバーライドします。コードは以下のように表示されます:

/**
 * @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 には、ほとんどのファイル操作シナリオに対応できる多数のファイル操作メソッドが用意されています。この記事では、指定したファイルの下にある一部のファイルまたはディレクトリを削除する方法については説明しません。実際には、visitFile メソッドを次のように書き換えるだけで済みます。自分自身のルール。ご質問やより良いコメントがございましたら、メッセージを残してください。

おすすめ

転載: blog.csdn.net/qq_43600166/article/details/125835838