>  기사  >  Java  >  Java에서 파일이나 폴더를 삭제하는 방법은 무엇입니까?

Java에서 파일이나 폴더를 삭제하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-04-13 17:31:165017검색

    파일이나 폴더를 삭제하는 네 가지 기본 방법

    다음 네 가지 방법으로 모두 파일이나 폴더를 삭제할 수 있습니다.

    공통점은 다음과 같습니다.

    폴더에 하위 파일이 포함되어 있으면 삭제에 실패합니다. 즉, 이 네 가지 방법은 빈 폴더만 삭제할 수 있다는 의미입니다.

    //delete는 즉시 삭제를 실행하는 것이고, deleteOnExit은 가상 머신을 종료할 때 프로그램을 삭제하는 것입니다.

    delete()

    • deleteOnExit() of File 클래스: 가상 머신이 종료되면 File 개체가 나타내는 파일 또는 디렉터리를 삭제합니다. 필수 디렉터리가 비어 있는지 확인하세요. 그렇지 않으면 삭제할 수 없으며 반환 값도 없습니다. File类的deleteOnExit():当虚拟机终止时,删除File对象表示的文件或目录,如果表示的是目录,需要保证目录是空的,否则无法删除,无返回值。

    • Files.delete(Path path)

    Files.delete(경로 경로): 매개변수로 전달된 경로에 있는 파일을 삭제합니다. 다른 파일 시스템 작업의 경우 이 방법은 원자적이지 않을 수 있습니다. 파일이 심볼릭 링크인 경우 링크의 최종 대상이 아닌 심볼릭 링크 자체가 삭제됩니다. 파일이 디렉터리인 경우 이 메서드는 디렉터리가 비어 있는 경우에만 파일을 삭제합니다.

    Files.deleteIfExists(Path path)

    다음 사항에 유의해야 합니다.

    기존 IO의 File 클래스와 NIO의 Path 클래스는 파일과 폴더를 모두 나타낼 수 있습니다. 위 4가지 방법의 단순 비교-설명성공적인 반환값폴더가 존재하지 않아 장애가 발생한다고 판단할 수 있는지폴더가 존재하지 않는다고 판단할 수 있는지 여부 비어 있지 않고 오류가 발생합니다delete() of File 클래스Traditional IOtruecannot(false 반환)cannot(false 반환)deleteOnExit() of File 클래스 전통적인 IO, 이것은 함정입니다. 피하세요. Void ,를 사용할 수 없지만 존재하지 않으면 삭제를 실행하지 않습니다. Files.Delete(PATH PATH) Files.deleteIfExists(경로 경로)을 사용하는 것이 좋습니다. File.delete() 대 Files.delete(경로 경로)
    Nio. Void nosuchFileException directemPTYEPTION
    NIO 거짓 DirectoryNotEmptyException
    //删除暂存的pdf
    File file =new File(pdfFilename);
    file.delete();
    
    Path path3 = Paths.get(pdfFilename);
    Files.delete(path3);

    차이:

    -JDKSource매개변수 반환 값 예외 선언이 발생함 파일은 그렇지 않습니다 존재비어 있지 않은 디렉터리 삭제점유된 파일 삭제 발생 다른 이유로 파일 삭제 불가의 특정 하위 클래스

    如何删除整个目录或者目录中的部分文件

    先造数据

    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处理遍历出来的每一项文件或文件夹

    • FileVisitor的visitFile方法用来处理遍历结果中的“文件”,所以我们可以在这个方法里面删除文件

    • FileVisitor的postVisitDirectory方法,注意方法中的“post”表示“后去做……”的意思,所以用来文件都处理完成之后再去处理文件夹,所以使用这个方法删除文件夹就可以有效避免文件夹内容不为空的异常,因为

    在去删除文件夹之前,该文件夹里面的文件已经被删除了。

    @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;
             }
    
          }
       );
    
    }

    下面的输出体现了文件的删除顺序

    文件被删除 : 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 里面包含了这些文件信息。

    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顺序颠倒一下,就达到了先删除文件,再删除文件夹的目的。

    下面的输出,是最终执行结果的删除顺序。

    删除文件成功: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

    传统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()方法只能列出文件夹下面的一层文件或文件夹,不能列出子文件夹及其子文件。

    先去递归删除子文件夹,再去删除文件夹自己本身。

    -File.delete() Files.delete(경로 경로)
    JDK1.0 JDK1.7
    java.io.File 객체 의 인스턴스 메소드 java.nio.file.Files 클래스의 정적 메소드
    매개변수 없음 java.nio.file.Path
    boolean void
    선언 없음 선언에서 java.io.IOException
    예외 발생 안 함, false 반환 java.nio.file.NoSuchFileException 발생
    삭제 불가, false 반환 삭제 불가, java.nio.file.DirectoryNotEmptyException 발생
    삭제 불가, false 반환 삭제 불가, java.nio.file.FileSystemException
    예외 발생 안됨, false 반환 Throw java.io.IOException

    위 내용은 Java에서 파일이나 폴더를 삭제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제