Java NIO.2 —— 文件或目录删除操作

文件删除

  删除单个文件的操作很简单,如果要删除一个目录树的话,需要实现FileVisitor 接口然后递归地调用delete()deleteIfExists()方法。在看代码之前,需要注意一下问题。

  • 在删除一个目录之前,要先删除里面的文件。
  • visitFile()方式是执行删除每个文件最好的方式。
  • 因为只有在目录为空的情况下才可以删除,所以建议在postVisitDirectory()方法中删除目录操作。
  • 如果文件不允许访问,你可以根据自己的决定使用visitFileFailed()方法来返回FileVisitResult.CONTINUETERMINATE
  • 删除过程可以跟踪符号链接文件,但是这不是一个可取的方式。因为符号链接可能指向超过删除域之外的文件。如果你能确认这种情况不会发生,或是还有其他约束条件阻止此情况发生,那么你可以跟踪符号链接文件。

  下面的程序用来删除C:\rafaelnadal目录下所有的目录和文件。

import java.io.IOException;
 import java.nio.file.FileVisitOption;
 import java.nio.file.FileVisitResult;
 import java.nio.file.FileVisitor;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.EnumSet;

class DeleteDirectory implements FileVisitor {    

 boolean deleteFileByFile(Path file) throws IOException {
     return Files.deleteIfExists(file);
  }

 @Override
  public FileVisitResult postVisitDirectory(Object dir, IOException exc)
                                                                  throws IOException {

    if (exc == null) {
         System.out.println("Visited: " + (Path) dir);
         boolean success = deleteFileByFile((Path) dir);

        if (success) {
              System.out.println("Deleted: " + (Path) dir);
         } else {
               System.out.println("Not deleted: " + (Path) dir);
         }
     } else {
         throw exc;
     }
     return FileVisitResult.CONTINUE;
  }

 @Override
  public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)
                                                                  throws IOException {
    return FileVisitResult.CONTINUE;
 }

 @Override
  public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)
                                                                  throws IOException {
    boolean success = deleteFileByFile((Path) file);

   if (success) {
         System.out.println("Deleted: " + (Path) file);
    } else {
         System.out.println("Not deleted: " + (Path) file);
    }

   return FileVisitResult.CONTINUE;
  }

 @Override
  public FileVisitResult visitFileFailed(Object file, IOException exc)
                                                                  throws IOException {
    //report an error if necessary

   return FileVisitResult.CONTINUE;
  }
 }

class Main {

 public static void main(String[] args) throws IOException {

   Path directory = Paths.get("C:/rafaelnadal");
    DeleteDirectory walk = new DeleteDirectory();
    EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);

   Files.walkFileTree(directory, opts, Integer.MAX_VALUE, walk);
   }
 }
时间: 2024-08-10 19:10:35

Java NIO.2 —— 文件或目录删除操作的相关文章

Java NIO.2 —— 文件或目录拷贝操作

拷贝整个文件树是可以递归每个目录和文件调用 Files.copy()方法.在使用的时候有一下注意事项. 在往目录拷贝文件之前,首先要保证目录已经存在.拷贝源目录(不论是否为空)都会生成目标目录.整个任务一定在preVisitDirectory()方法中执行. visitFile()方式用来拷贝每个文件最佳的方法. 在你拷贝目录或文件时,你需要决定是否要使用REPLACE_EXISTING 和COPY_ATTRIBUTES 选项. 如果你想保存要拷贝的目录的属性,你需要在postVisitDire

使用Java NIO监视文件

通过优锐课的java小课中学习到了很多重点,一起来看看了解有关使用Java NIO观看文件的更多信息. 该??java.nio.file??包提供了一个文件更改通知API,被称为??手表服务API.它使我们能够在监视服务中注册文件夹.注册时,我们告诉服务我们感兴趣的事件类型是:文件创建,文件修改或文件删除. 当服务检测到感兴趣的事件时,会将其转发到注册的进程并根据需要进行处理.基本上是这样的: 1.第一步是WatchService?使用类的newWatchService()?方法创建一个新??的

Java IO和Java NIO在文件拷贝上的性能差异分析 (转)

1.       在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取 到用户空间的缓冲区.参看read(byte b[])方法的源码,可知,它会在内部再调用readBytes(b, 0, b.length)方法,而且readBytes(b, 0, b.length)方法是一个native方法(即本地方法),最终通过这个本地方法来发起一次系统调用,即调用系统内核的read()

python 文件与目录的操作   未完善 需要重新学习

文件与目录的操作:    -文件读写:python进行文件读写的函数是open或file file_handler = open(filename,mode) mode, 模式 说明 r 只读 r+ 读写 w 写入,先删除原文件,在重新写入,如果文件没有则 创建 w+ 读写,先删除原文件,在重新写入,如果文件没有则创建(可以写入输出) 读范例: >>> fo  = open('/tools/123/test.log')                                   

Perl文件、目录常用操作

注意,这些操作的对象是文件名(相对路径/绝对路径),而非文件/目录句柄,句柄只是perl和文件系统中文件的关联通道,而非实体对象. 创建文件 在unix类操作系统中有一个touch命令可以非常方便的创建文件,还能批量创建一些名称规律的文件.但实际上touch的主要介绍中却是"修改文件时间戳",创建文件只不过是它的辅助能力.如果没有touch命令,如何在shell环境下创建文件?最佳方式是通过重定向的方式. 在perl中没有touch类似的功能,所以原始地只能通过open打开输出类的文件

Java中移动文件或目录的方法盘点

本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:Java中移动文件或目录的方法盘点: import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class M

Java IO和Java NIO在文件拷贝上的性能差异分析

1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区.参看read(byte b[])方法的源码,可知,它会在内部再调用readBytes(b, 0, b.length)方法,而且readBytes(b, 0, b.length)方法是一个native方法(即本地方法),最终通过这个本地方法来发起一次系统调用,即调用系统内核的read()方法,内核从

文件及目录相关操作

PHP创建文件(夹)以及目录操作 一.目录操作         首先是从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出: <?php$base_dir="filelist/"; //打开目录 $fso=opendir($base_dir);echo  $base_dir."<hr/>";while($flist=readdir($fso)){//文件列表 echo $flist

(15) PHP 随笔---LAMP Linux基本操作 对文件、目录的操作

◇对目录的操作: ◇创建目录: mkdir Xmu //在当前目录下创建一个名为Xmu的目录 ◇创建多个级别目录关系: mkdir -p newdir/newdir/newdir //在当前目录下创建多个连续目录,-p的意思是以递归的方式 ◇移动目录(也可以针对文件操作): mv dir1 dir2 //把dir1移动到dir2目录下 mv dir1/dir2 dir3 //把dir2移动到dir3目录下 mv dir1/dir2 dir3/dir4 //把dir2移动到dir4目录下 ◇改目录