`

【Java NIO 简例】Files

    博客分类:
  • Java
nio 
阅读更多

原文:《Java NIO Files

Java NIO 的 Files 类(java.nio.file.Files)提供了多个方法用于操纵文件系统中的文件。此教程包含这些方法中最常用的几个。Files类包含了许多方法,如果你需要的方法未包含在此教程中,可以去查看JavaDoc。

java.nio.file.Files 类与 java.nio.file.Path 类协同工作,所以在使用 Files 类前,你需要了解 Path 类。

 

Files.exists()

此方法用于检查给定的 Path 实例对应的路径是否存在。

我们可以创建一个对应路径不存在的Path实例。如,假设你要创建一个新目录,你可以先创建一个相应的 Path实例,然后再创建该目录。

例:

Path path = Paths.get("C:\\test\\file1.txt");
boolean pathExists = Files.exists(path);

 

Files.createDirectory()

该方法用于创建一个目录。例:

Path path = Paths.get("C:\\test\\dir1")
try {
  Path newDir = Files.createDirectory(path);
} catch (Exception e) {
  ...
}

注意:该方法只会创建目标路径的最后一层目录。如果路径中有部分“父目录”不存在,会抛异常。所以 Files.createDirectories() 方法可能更常用。

 

Files.copy()

该方法用于拷贝文件。例:

Path srcPath = Paths.get("C:\\test\\file1.txt");
Path dstPath = Paths.get("C:\\new\\newFile1.txt");

try {
  Files.copy(srcPath, dstPath);
} catch (Exception e) {
  ...
}

如果目标路径文件已存在,将抛出 FileAlreadyExistsException。
可以指定参数以强制覆盖已有文件。例:

Files.copy(srcPath, dstPath, StandardCopyOption.REPLACE_EXISTING);

 

Files.move()

该方法用于将文件移动到另一个路径。
在文件系统中,“移动(move)”文件 几乎等同于 “重命名(rename)”文件。
虽然通常“重命名”只表示更改文件的名称,而“移动”则可以将文件移到另一个目录中。
另,java.io.File类的实例方法 renameTo() 与此方法效果相同,既能重命名,又能移到其它目录。

例:

Path srcPath = Paths.get("C:\\test\\file1.txt");
Path dstPath = Paths.get("C:\\new\\newFile1.txt");

try {
  Files.move(srcPath, dstPath);
} catch (Exception e) {
  ...
}

 

与 copy() 方法一样,如果目标路径方法已存在,会抛出 FileAlreadyExistsException. 可以指定参数以强制覆盖原文件:

Files.move(srcPath, dstPath, StandardCopyOption.REPLACE_EXISTING);

 

Files.delete()

该方法用于删除目标路径(文件或目录)。例:

Path path = Paths.get("C:\\test\file1.txt");
try {
  Files.delete(path);
} catch (Exception e) {
  ...
}

 

Files.walkFileTree()

该方法用于递归地遍历一个目录树。

通常,我们可以,指定一个 Path实例作为遍历的起始位置,指定一个 FileVisitor实例用于操作遍历到了文件与目录。
如果Path路径指向一个文件,则只会访问这个文件,然后退出。因为文件没有子目录。

FileVisitor 的实现与具体业务相关,需要调用者自己实现。

public interface FileVisitor<T> {
  FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) throws IOException;
  FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException;
  FileVisitResult visitFileFailed(T file, IOException exc) throws IOException;
  FileVisitResult postVisitDirectory(T dir, IOException exc) throws IOException;
}

FileVisitor 中各方法的调用时机正如方法名称所表示。

如果你不想实现所有4个方法,可以继承自 SimpleFileVisitor 类,并 override 需要自定义的方法。

FileVisitResult 枚举类包含4个枚举项:

  • CONTINUE:继续正常遍历
  • TERMINATE:终止遍历
  • SKIP_SIBLINGS:跳过当前目录的子目录,并继续遍历
  • SKIP_SUBTREE:跳过当前目录。该枚举项只有作为 preVisitDirectory() 方法的返回值时才有效(或者说有意义)。因为其它方法被调用时都已经在遍历当前目录的内容了,当然不可能跳过。

例:

Files.walkFileTree(path, new FileVisitor() {
  @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;
  }
});

 

示例:搜索文件

此示例中,FileVisitor 继承自 SimpleFileVisitor,用于查找名称为 README.txt 的文件:

Path rootPath = Paths.get("C:\\test");
String fileToFind = File.separator + "README.txt";
try {
  Files.walkFileTree(rootPath, new SimpleFileVisitor() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
      String fileString = file.toAbsolutePath().toString();

      if (fileString.endsWith(fileToFind)) {
        System.out.println("file found at path: " + fileString);
        return FileVisitResult.TERMINATE;
      }

      return FileVisitResult.CONTINUE;
    }
  });
} catch (IOException e) {
  ...
}

 

示例:递归地删除目录

Files.delete() 方法可用于删除一个空的目录。如果目录不为空(有文件或子目录),Files.delete() 将抛出异常 DirectoryNotEmptyException。

Files.walkFileTree()方法可以递归的方式删除这类非空目录。例:

Path rootPath = Paths.get("C:\\test");
try {
  Files.walkFileTree(rootPath, new SimpleFileVisitor() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes atrrs) throws IOException {
      System.out.println("delete file: " + file);
      File.delete(file);
      return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
      Files.delete(dir);
      System.out.println("delete dir: " + dir);
      return FileVisitResult.CONTINUE;
    }
  });
} catch(IOException e) {
  ...
}

 

分享到:
评论

相关推荐

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    Java NIO英文高清原版

    Java NIO英文高清原版

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    基于Java NIO实现五子棋游戏.zip

    基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现...

    JAVA NIO 按行读取大文件,支持 GB级别

    设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 这样字节的判断,然后 返回行 如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理...

    java NIO技巧及原理

    java NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较

    java NIO.zip

    java NIO.zip

    【Java NIO 简例】分散(Scatter) – 聚集(Gather)

    原文:《Java NIO Scatter / Gather》 Scatter(分散):将一个 Channel 中的数据读取到多个 Buffer 中。 Gather(聚集):将多个 Buffer 中的数据写入一个 Channel 中。 Scatter/Gather 机制可以方便处理多个分开的...

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    java nio 读文件

    java nio 读文件,java nio 读文件

    JAVA NIO 学习资料

    JAVA NIO学习资料JAVA NIO学习资料

    Java NIO 英文文字版

    Many serious Java programmers, especially enterprise Java programmers, consider the new I/O API--called NIO for New Input/Output--the most important feature in the 1.4 version of the Java 2 Standard ...

    Java NIO实战开发多人聊天室

    01-Java NIO-课程简介.mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 ...

Global site tag (gtag.js) - Google Analytics