专栏首页清晨我上码第九节 netty前传-NIO 补充Path和File

第九节 netty前传-NIO 补充Path和File

NIO Path

Java NIO.Path接口位于java.nio.file包中,所以Java Path接口的完全限定名称是java.nio.file.Path。

Java Path实例表示文件系统中的路径。路径可以是绝对的或相对的。绝对路径包含从文件系统根目录到其指向的文件或目录的完整路径。相对路径包含相对于其他路径的文件或目录的路径。 很多时候,java.nio.file.Path接口类似于java.io.File类,但存在一些细微差别。在许多情况下,甚至可以使用Path接口替换File类的使用。

  1. 创建path实例

Path path = Paths.get("c:\data\myfile.txt"); 上面的Path 为接口,Paths为工厂类

当然上面为决定路径,也可以创建相对路径

//相对路径,第一个参数作为相对的参考
Path path = Paths.get("d:\\base",
                       "..\\revlet-path");

NIO file

java.nio.file.Files的Files类提供了几种操作文件的方法

  1. 检查文件是否存在
//文件路径
Path path = Paths.get("data/logging.properties");
//注意第二个参数,的含义作为判断文件是否存在的判断依据,此处表示不依赖文件连接
boolean pathExists =
        Files.exists(path,
            new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
  1. 创建目录
Path path = Paths.get("data/subdir");
try {
    Path newDir = Files.createDirectory(path);
} catch(FileAlreadyExistsException e){
    // the directory already exists.
} catch (IOException e) {
    //something else went wrong
    e.printStackTrace();
}
  1. 拷贝
Path sourcePath      = Paths.get("data/logging.properties");
Path destinationPath = Paths.get("data/logging-copy.properties");
try {
    Files.copy(sourcePath, destinationPath);
} catch(FileAlreadyExistsException e) {
    //destination file already exists
} catch (IOException e) {
    //something else went wrong
    e.printStackTrace();
}
  1. 移动文件
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) {
    //moving file failed.
    e.printStackTrace();
}
  1. 删除文件
Path path = Paths.get("data/subdir/logging-moved.properties");
try {
    Files.delete(path);
} catch (IOException e) {
    //deleting file failed
    e.printStackTrace();
}
  1. 递归遍历目录树的功能。

Files.walkFileTree()方法用于递归遍历目录树的功能。参数包含Path实例和FileVisitor作为参数。FileVisitor是一个接口,业务功能需要自己实现

Files.CONTINUE表示文件遍历应该正常继续。

TERMINATE表示文件遍历应立即终止。

SKIP_SIBLINGS意味着文件遍历应该继续但不访问此文件或目录的任何兄弟。

SKIP_SUBTREE表示文件遍历应该继续但不访问此目录中的条目。(path, new FileVisitor<Path>() {
//在访问任何目录之前调用
  @Override
  public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
    System.out.println("pre visit dir:" + dir);
    return FileVisitResult.CONTINUE;
  }
//在文件遍历期间访问的每个文件(不是目录)都会调用visitFile()方法
  @Override
  public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    System.out.println("visit file: " + file);
//返回值
//CONTINUE表示文件遍历应该正常继续。
//TERMINATE表示文件遍历应立即终止。
//SKIP_SIBLINGS意味着文件遍历应该继续但不访问此文件或目录的任何并列文件。
//SKIP_SUBTREE表示文件遍历应该继续但不访问此目录中的条目。
    return FileVisitResult.CONTINUE;
  }
//访问文件失败,则调用visitFileFailed()方法
  @Override
  public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
    System.out.println("visit file failed: " + file);
    return FileVisitResult.CONTINUE;
  }
// 访问目录后立即调用postVisitDirectory()方法。
  @Override
  public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    System.out.println("post visit directory: " + dir);
    return FileVisitResult.CONTINUE;
  }
});
  • walkFileTree 的使用例子
/**
*Files.walkFileTree()递归查询文件
*/
Path rootPath = Paths.get("data");
String fileToFind = File.separator + "README.txt";
//SimpleFileVisitor继承接口FileVisitor,不过已经帮我我们实现了部分功能
try {
  Files.walkFileTree(rootPath, 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.TERMINATE;
      }
      return FileVisitResult.CONTINUE;
    }
  });
} catch(IOException e){
    e.printStackTrace();
}

/**
*Files.walkFileTree()也可用于删除包含其中所有文件和子目录的目录。
*Files.delete()方法只会删除目录为空的目录。 通过浏览所有目录并删除每个目录
*中的所有文件(在visitFile()内部,然后删除目录本身(在postVisitDirectory()
*内),您可以删除包含所有子目录和文件的目录。 这是一个递归目录删除示例
*/
Path rootPath = Paths.get("data/to-delete");
try {
  Files.walkFileTree(rootPath, 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();
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 1-python data science

    这意味着与使用C之类的编译语言中的整数相比,在Python中存储整数会产生一些开销,如下图所示:

    用户1418372
  • docker运行容器远程挂载卷

    用户1418372
  • docker-machine 创建swarm集群

    1、安装virtualbox 在/etc/yum.repos.d/目录下新建virtualbox.repo 写入:

    用户1418372
  • 【Python环境】python数据挖掘领域工具包

    Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy。其中Numpy是一个用python实现的科学计算包。包括: 一个强大的N维数组对象Ar...

    陆勤_数据人网
  • Python补充02 Python小技巧

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 在这里列举一些我使用Python时积累的小...

    Vamei
  • Python机器学习工具包

    ? 作者 | 空木 来源 | CSDN社区 Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy。其中Numpy是一个用pytho...

    小小科
  • 【Python环境】Python机器学习库

    Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy。其中Numpy是一个用python实现的科学计算包。包括: 一个强大的N维数组对象Ar...

    陆勤_数据人网
  • java nio: walkFileTree实现文件夹复制移动删除

    从java 1.7开始,java提供了java.noi.file.Files类用于更方便的实现文件/文件夹操作。 在Files中提供了丰富的静态方法用于文件...

    用户1148648
  • Nginx静态资源应用场景与跨域配置示例

    小柒吃地瓜
  • Python | 十个Python程序员易犯的错误

    不管是在学习还是工作过程中,人都会犯错。虽然Python的语法简单、灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序员都有可能会栽跟头。本...

    CDA数据分析师

扫码关注云+社区

领取腾讯云代金券