次の 4 つの方法はいずれもファイルまたはフォルダーを削除できます。
これらの共通点は次のとおりです。
フォルダーにサブファイルが含まれている場合、削除は失敗します。つまり、これら 4 つの方法では空のフォルダーしか削除できません。
//delete はすぐに削除を実行するのに対し、deleteOnExit は仮想マシンの終了時にプログラムを削除します。
delete() of File class
deleteOnExit() of File class
: 仮想マシンの終了時に削除File オブジェクトによって表されるファイルまたはディレクトリ。ディレクトリを表す場合は、そのディレクトリが空であることを確認する必要があります。そうでない場合は削除できず、戻り値はありません。
Files.delete(Path path)
: パラメータとして渡されたパス上にあるファイルを削除します。他のファイル システム操作の場合、このメソッドはアトミックではない可能性があります。ファイルがシンボリック リンクの場合、リンクの最終ターゲットではなく、シンボリック リンク自体が削除されます。ファイルがディレクトリの場合、このメソッドはディレクトリが空の場合にのみファイルを削除します。
Files.deleteIfExists(Path path)
次の点に注意してください:
従来の IO の File クラスと NIO の Path クラスは、ファイルとフォルダーの両方を表すことができます。
#上記 4 つのメソッドの簡単な比較説明 | 成功の戻り値 | フォルダが存在しないと判断して失敗するかどうか | ##フォルダが空でないと判断して失敗するかどうか | |
---|---|---|---|---|
true | できません (false を返す) | できません (false を返す) | ## ファイル クラスの DeleteOnExit() | #従来の IO、これは落とし穴です。使用は避けてください |
使用できませんが、存在しないため、削除は実行されません | Cannot (return void) | Files.delete(Path path) | NIO、それ | |
NoSuchFileException | DirectoryNotEmptyException | Files.deleteIfExists(Path path) | を使用することをお勧めします。 NIO | |
false | DirectoryNotEmptyException | ##File.delete() と Files.delete(Path path の比較) ) | //删除暂存的pdf File file =new File(pdfFilename); file.delete(); Path path4 = Paths.get(pdfFilename); Files.delete(path4); | 違い:
JDK | ||
---|---|---|
Source | java.io.File オブジェクトのインスタンス メソッド | |
Parameters | パラメータなし | |
戻り値 | boolean | |
#例外宣言 | 宣言がありません | java.io.IOExceptionをスローするステートメント |
ファイルが存在しません | 例外をスローせず、false を返します | java.nio.file.NoSuchFileExceptionをスローします |
空でないディレクトリを削除します | 削除できません。 return false | 削除できません、java.nio.file.DirectoryNotEmptyExceptionをスローします |
占有されているファイルを削除します | 削除できません、falseを返します | 削除できません。java.nio.file.FileSystemException をスローします。 |
ファイルは他の理由で削除できません。 | 例外をスローしないで、false を返します。 | java.io.IOException の特定のサブクラスをスローする |
##如何删除整个目录或者目录中的部分文件先造数据 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()); } walkFileTree与FileVisitor使用walkFileTree方法遍历整个文件目录树,使用FileVisitor处理遍历出来的每一项文件或文件夹
在去删除文件夹之前,该文件夹里面的文件已经被删除了。 @Test void testDeleteFileDir5() throws IOException { createMoreFiles(); Path path = Paths.get("D:\data\test1\test2"); Files.walkFileTree(path, new SimpleFileVisitor<Path>() { // 先去遍历删除文件 @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; } } ); } 下面的输出体现了文件的删除顺序
我们既然可以遍历出文件夹或者文件,我们就可以在处理的过程中进行过滤。比如: 按文件名删除文件或文件夹,参数Path里面含有文件或文件夹名称 按文件创建时间、修改时间、文件大小等信息去删除文件,参数BasicFileAttributes 里面包含了这些文件信息。 Files.walk如果你对Stream流语法不太熟悉的话,这种方法稍微难理解一点,但是说实话也非常简单。 使用Files.walk遍历文件夹(包含子文件夹及子其文件),遍历结果是一个Stream 对每一个遍历出来的结果进行处理,调用Files.delete就可以了。 @Test void testDeleteFileDir6() throws IOException { createMoreFiles(); Path path = Paths.get("D:\data\test1\test2"); try (Stream<Path> 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顺序颠倒一下,就达到了先删除文件,再删除文件夹的目的。 下面的输出,是最终执行结果的删除顺序。
传统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でファイルやフォルダを削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。