Java NIO Files类配合操作文件的实例

一、前言

该类只包含对文件,目录或其他类型文件进行操作的静态方法

二 、主要的API 使用说明
  1. exists()

检查给定的path 在文件系统中是否存在

Path path = Paths.get("D:\\data");
boolean pathExists = Files.exists(path,new LinkOption[]{LinkOption.NOFOLLOW_LINKS});
// 输出  false
System.out.println(pathExists);
  1. createDirectory()

创建一个新的目录

// 如果该目录已经存在,则是抛出一个java.nio.file.FileAlreadyExistsException
Path path1 = Paths.get("D://test");
try {
      Files.createDirectory(path1);
  } catch (IOException e) {
      e.printStackTrace();
  }
  1. createDirectories()

创建多级目录

Path path2 = Paths.get("D://test//java//log");
 try {
      //创建多级目录
      Files.createDirectories(path2);
  } catch (IOException e) {
      e.printStackTrace();
  }
  1. copy()

Files.copy()方法从一个路径拷贝一个文件到另外一个目录 或者重命名

Path path = Paths.get("D:\\test");
        Path path1 = Paths.get("D:\\test\\java\\log.txt");
        Path path2 = Paths.get("D:\\test\\java\\log\\logs.txt");
        // StandardCopyOption.REPLACE_EXISTING  目标文件已经存在,这个参数指示copy()方法覆盖现有的文件
        //Files.copy(path, path1, StandardCopyOption.REPLACE_EXISTING);
        try {
            Files.copy(path, path1);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
  1. move()

Java NIO Files还包含一个函数,用于将文件从一个路径移动到另一个路径。移动文件与重命名相同,但是移动文件既可以移动到不同的目录,也可以在相同的操作中更改它的名称

Path sourcePath = Paths.get("data/logging-copy.properties");
Path destinationPath = Paths.get("data/subdir/logging-moved.properties");
try {
    Files.move(sourcePath, destinationPath,
            StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
    //移动文件失败
    e.printStackTrace();
}
  1. delete()

Files.delete()方法可以删除一个文件或者目录

Path path = Paths.get("data/subdir/logging-moved.properties");
try {
    Files.delete(path);
} catch (IOException e) {
    // 删除文件失败
    e.printStackTrace();
}
  1. walkFileTree()

Files.walkFileTree()方法包含递归遍历目录树的功能。
walkFileTree()方法将Path实例和FileVisitor作为参数。
Path实例指向您想要遍历的目录。
FileVisitor在遍历期间被调用。
FileVisitor接口必须自己实现,并将实现的实例传递给walkFileTree()方法。
在目录遍历过程中,FileVisitor实现的每个方法都将被调用。
如果不需要实现所有这些方法,那么可以扩展SimpleFileVisitor类,它包含FileVisitor接口中所有方法的默认实现。

walkFileTree()的例子

//遍历文件或者目录

 Path path = Paths.get("D:\\test\\java\\log\\logs.txt");
        try {
            Files.walkFileTree(path, new FileVisitor<Path>() {
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                    System.out.println("pre visit dir:" + dir);
                    return FileVisitResult.CONTINUE;
                }
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    System.out.println("visit file: " + file);
                    return FileVisitResult.CONTINUE;
                }
                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                    System.out.println("visit file failed: " + file);
                    return FileVisitResult.CONTINUE;
                }
                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    System.out.println("post visit directory: " + dir);
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

这里是一个用于扩展SimpleFileVisitor的walkFileTree()

//===============================文件搜索===================
	    Path path = Paths.get("D:\\test\\java\\log\\logs.txt");
        String fileToFind =  "log.txt";
        try {
            Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    String fileString = file.toAbsolutePath().toString();
                    System.out.println("pathString = " + fileString);
                    if(fileString.endsWith(fileToFind)){
                        System.out.println("file found at path: " + file.toAbsolutePath());
                        return FileVisitResult.CONTINUE;
                    }
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch(IOException e){
            e.printStackTrace();
        }*/

Files.walkFileTree()也可以用来删除包含所有文件和子目录的目录。Files.delete()方法只会删除一个目录,如果它是空的。通过遍历所有目录并删除每个目录中的所有文件(在visitFile())中,然后删除目录本身(在postVisitDirectory()中),您可以删除包含所有子目录和文件的目录。

//遍历删除文件
Path path = Paths.get("D:\\test\\java\\log\\logs.txt");
try {
            Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    System.out.println("delete file: " + file.toString());
                    Files.delete(file);
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    Files.delete(dir);
                    System.out.println("delete dir: " + dir.toString());
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch(IOException e){
            e.printStackTrace();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值