Java NIO.2(New I/O)是Java SE 7引入的一组用于处理I/O操作的新API。它在Java标准库中提供了更灵活、高效的文件和文件系统操作方式,相对于传统的Java I/O(java.io)包,Java NIO.2提供了更多的功能和更好的性能。
下面是一些Java NIO.2 API的关键类和功能:
1. java.nio.file.Path - 表示文件或目录的路径,提供了各种操作路径的方法,如获取父路径、解析路径等。
2. java.nio.file.Paths - 提供了创建、转换和解析路径的方法,例如通过字符串创建路径对象。
3. java.nio.file.Files - 提供了许多对文件和目录进行操作的静态方法,如复制、移动、删除、创建目录等。
4. java.nio.file.StandardOpenOption - 定义了文件打开选项,如读取、写入、追加等。
5. java.nio.file.FileVisitor - 定义了对文件树进行遍历的接口,可以自定义访问文件和目录时的行为。
6. java.nio.file.attribute.FileAttributes - 提供了文件和目录属性的方法,如文件大小、创建时间、修改时间等。
7. java.nio.file.WatchService - 提供了监视文件和目录变化的功能,可以监听文件的创建、修改、删除等事件。
通过使用这些类和方法,你可以更方便地进行文件和文件系统的操作,如读写文件、复制文件、遍历文件树、监视文件变化等。
--------
java.nio.file 包提供了访问文件、文件属性和文件系统的接口和类。它包含了一些核心的类和接口,用于处理文件和目录的操作。
以下是 java.nio.file 包中的一些主要类和接口:
1. Path:表示文件或目录的路径。它提供了许多操作路径的方法,如获取父路径、解析路径等。
2. Paths:提供了创建、转换和解析路径的方法,例如通过字符串创建路径对象。
3. Files:提供了各种对文件和目录进行操作的静态方法,如复制、移动、删除、创建目录等。
4. FileVisitor:定义了对文件树进行遍历的接口,可以自定义访问文件和目录时的行为。
5. WatchService:提供了监视文件和目录变化的功能,可以监听文件的创建、修改、删除等事件。
java.nio.file.attribute 包提供了对文件和文件系统属性的访问的接口和类。
以下是 java.nio.file.attribute 包中的一些主要类和接口:
1. BasicFileAttributes:定义了文件的基本属性,如文件大小、创建时间、修改时间等。
2. FileAttribute:定义了文件属性的接口,可以用于设置文件的某些属性。
3. FileAttributeView:定义了访问文件属性视图的接口,可以获取和修改文件的属性。
4. PosixFilePermission:枚举类型,定义了 POSIX 文件权限。
5. FileOwnerAttributeView:定义了访问文件所有者的接口,可以获取和修改文件的所有者。
通过使用这些类和接口,可以方便地访问和操作文件、文件属性和文件系统。
java.nio.file.StandardOpenOption 是一个枚举类,定义了文件打开选项,用于指定在打开文件时的行为。它包含了多个常量,可以在打开文件时使用其中的一个或多个选项。
以下是 StandardOpenOption 中常用的一些选项:
- READ:以读取方式打开文件。
- WRITE:以写入方式打开文件。
- APPEND:以追加方式打开文件,新数据将追加到文件末尾。
- CREATE:如果文件不存在,则创建新文件。
- CREATE_NEW:创建一个新文件,如果文件已存在则抛出异常。
- TRUNCATE_EXISTING:将现有文件截断为零字节大小。
通过使用这些选项,可以根据需求来打开文件并指定相应的行为。
java.nio.file.FileVisitor 是一个接口,定义了对文件树进行遍历时的行为。它包含了多个方法,可以自定义对文件和目录的访问方式。
以下是 FileVisitor 中的主要方法:
- preVisitDirectory(Path dir, BasicFileAttributes attrs):在访问目录之前调用。
- postVisitDirectory(Path dir, IOException exc):在访问目录之后调用。
- visitFile(Path file, BasicFileAttributes attrs):访问文件时调用。
- visitFileFailed(Path file, IOException exc):访问文件失败时调用。
通过实现 FileVisitor 接口,并重写这些方法,可以实现对文件树进行自定义的遍历和访问操作,例如在访问文件时执行特定的逻辑。
java.nio.file.WatchService 是 Java NIO.2 中提供的一个 API,用于监视文件和目录的变化。它可以监听文件的创建、修改、删除等事件,并在事件发生时触发相应的操作。
以下是 WatchService 的主要方法:
- register(Path dir, WatchEvent.Kind<?>[] events, WatchEvent.Modifier... modifiers):注册要监视的目录,并指定要监视的事件类型和修饰符。
- Path dir:要监视的目录的路径。
- WatchEvent.Kind<?>[] events:要监视的事件类型数组。可以传递多个事件类型,例如 StandardWatchEventKinds.ENTRY_CREATE、StandardWatchEventKinds.ENTRY_MODIFY、StandardWatchEventKinds.ENTRY_DELETE 等。
- WatchEvent.Modifier... modifiers:可选的修饰符参数,用于修改监视行为。修饰符可以是以下之一:
- com.sun.nio.file.SensitivityWatchEventModifier.HIGH:高灵敏度修饰符,对文件系统实现更灵敏的监听。
- com.sun.nio.file.SensitivityWatchEventModifier.LOW:低灵敏度修饰符,对文件系统实现较低的监听。
- poll():检索下一个可用的 WatchKey,或者如果没有可用的 WatchKey,则立即返回 null。
- take():检索并删除下一个可用的 WatchKey,如果没有可用的 WatchKey,则等待。
- close():关闭此监视服务。
通过调用 register() 方法来注册要监视的目录,并指定要监视的事件类型和修饰符。然后使用 poll() 或 take() 方法检索 WatchKey,以获取有关已发生的事件的信息。最后,使用 close() 方法关闭监视服务。
-------------
- 使用 Files.walkFileTree() 方法遍历文件树
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;public class NioFilesTraversalExample {public static void main(String[] args) {Path startPath = Paths.get("C:\\Users\\Administrator\\Documents"); // 替换为你有权限访问的目录try {// new SimpleFileVisitor<>() {} 是创建了一个匿名内部类,并且对 SimpleFileVisitor 进行了实现。// 在这个匿名内部类中,我们重写了 visitFile() 和 visitFileFailed() 方法来定义自己的文件访问行为。Files.walkFileTree(startPath, new SimpleFileVisitor<>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {System.out.println(file);return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {if (exc instanceof AccessDeniedException) {System.err.println("Access denied: " + file);return FileVisitResult.SKIP_SUBTREE;} else {throw exc;}}});} catch (IOException e) {e.printStackTrace();}}
}/*
Files.walkFileTree是Java NIO.2 API提供的一个非常方便的方法,可以用于遍历指定路径下的所有文件和子目录。
它接受两个参数:要遍历的起始目录路径和一个FileVisitor对象。在我们的例子中,我们传递了一个匿名内部类,这个类继承了SimpleFileVisitor类,
并实现了其中的两个方法:visitFile和visitFileFailed。visitFile方法会在访问到每一个文件时被调用,它传递了两个参数:当前文件的路径和文件属性。
在这个方法中,我们简单地输出了文件的路径,并返回了CONTINUE,表示继续遍历。visitFileFailed方法会在访问文件失败时被调用,它传递了两个参数:当前文件的路径和导致访问失败的异常。
在这个方法中,我们检查了异常类型是否为AccessDeniedException(访问被拒绝异常),
如果是,则输出错误信息并返回SKIP_SUBTREE,表示跳过子目录。
如果不是,则抛出异常,让程序崩溃并输出错误信息。最后,在try块中,我们调用了Files.walkFileTree方法,并处理了可能出现的IOException异常。通过以上方法,我们可以遍历指定目录下的所有文件和子目录,并且能够处理访问被拒绝的情况。Files.walkFileTree() 方法是 Java NIO 包中的一个功能强大的方法,用于递归地遍历文件树。它可以用来执行各种文件操作,比如复制、移动、删除文件等。
以下是 Files.walkFileTree() 方法的基本用法:
Files.walkFileTree(Path start, FileVisitor<? super Path> visitor)
start:表示要遍历的起始路径。
visitor:表示一个实现了 FileVisitor 接口的对象,用于定义对文件树中每个文件和目录的访问行为。
FileVisitor 接口定义了访问文件树节点时的各种行为,包括访问文件、访问目录、访问失败等。你可以根据需要实现这个接口,并传递给 walkFileTree 方法。使用 Files.walkFileTree() 方法,你可以遍历文件树并对每个文件和目录执行自定义操作,例如打印文件路径、复制文件等。*/
Files.walkFileTree() 方法是 Java NIO 包中的一个功能强大的方法,用于递归地遍历文件树。它可以用来执行各种文件操作,比如复制、移动、删除文件等。
以下是 Files.walkFileTree() 方法的基本用法:
Files.walkFileTree(Path start, FileVisitor<? super Path> visitor)
start:表示要遍历的起始路径。
visitor:表示一个实现了 FileVisitor 接口的对象,用于定义对文件树中每个文件和目录的访问行为。
FileVisitor 接口定义了访问文件树节点时的各种行为,包括访问文件、访问目录、访问失败等。你可以根据需要实现这个接口,并传递给 walkFileTree 方法。
使用 Files.walkFileTree() 方法,你可以遍历文件树并对每个文件和目录执行自定义操作,例如打印文件路径、复制文件等。
-----------------
-
使用
WatchService
监视文件的创建、修改和删除事件
import java.nio.file.*;public class NioFileWatcherExample {public static void main(String[] args) throws Exception {// 创建 WatchService 对象WatchService watchService = FileSystems.getDefault().newWatchService();// 注册要监视的目录Path directory = Paths.get("C:\\Users\\Administrator\\Documents");directory.register(watchService,StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_MODIFY,StandardWatchEventKinds.ENTRY_DELETE);// 循环检查 WatchKeywhile (true) {WatchKey key = watchService.take();for (WatchEvent<?> event : key.pollEvents()) {WatchEvent.Kind<?> kind = event.kind();if (kind == StandardWatchEventKinds.OVERFLOW) {continue;}// 获取事件发生的文件名@SuppressWarnings("unchecked")WatchEvent<Path> pathEvent = (WatchEvent<Path>) event;Path fileName = pathEvent.context();// 打印事件类型和文件名System.out.println("Event: " + kind + ", File: " + fileName);}key.reset();}}
}