Java NIO、NIO.2学习笔记(六)
Exception exc)
访问file文件失败时触发该方法
复制代码
以上4个方法都返回一个FileVisitResult对象,它是一个枚举类,代表了访问之后的后续行为。FileVisitResult定义了如下几种后续行为
复制代码
1. CONTINUE
代表"继续访问"的后续行为
2. SKIP_SIBLINGS
代表"继续访问"的后续行为,但不访问该文件或目录的兄弟文件或目录
3. SKIP_SUBTREE
代表"继续访问"的后续行为,但不访问该文件后目录的子目录树
4. TERMINATE
代表"终止访问"的后续行为
复制代码
code:
复制代码
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
public class FileVisitorTest
{
public static void main(String[] args) throws Exception
{
// 遍历g:\publish\codes\15目录下的所有文件和子目录
Files.walkFileTree(Paths.get("D:", "学习资料", "视频学习资料", "JAVA学习", "疯狂java", "code", "codes", "15"), new SimpleFileVisitor()
{
// 访问文件时候触发该方法
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
{
System.out.println("正在访问" + file + "文件");
// 找到了FileInputStreamTest.java文件
if (file.endsWith("FileInputStreamTest.java"))
{
System.out.println("--已经找到目标文件--");
return FileVisitResult.TERMINATE;
}
return FileVisitResult.CONTINUE;
}
// 开始访问目录时触发该方法
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
{
System.out.println("正在访问:" + dir + " 路径");
return FileVisitResult.CONTINUE;
}
});
}
}
复制代码
0x7: 使用WatchService来监控磁盘文件变动
NIO.2的Path类提供了如下的方法来监听文件系统的变动
复制代码
1. WatchKey register(WatchService watcher, WatchEvent.Kind< >
[] events, WatchEvent.Modifier... modifiers)
1) watcher: 代表一个文件系统监听服务,它监听该path代表的目录下的文件变化
2) events参数指定要监听哪些类型的事件
2.1) ENTRY_CREATE
2.2) ENTRY_DELETE
2.3) ENTRY_MODIFY
2.4) OVERFLOW
复制代码
一旦使用register()方法完成注册之后,接下来就可以调用WatchService的方法来获取被监听目录的文件变化事件
1. WatchKey poll()
获取下一个WatchKey,如果没有WatchKey发生就立即返回null
2. WatchKey poll(long timeout, TimeUnit unit)
尝试等待timeout时间(最大延时)去获取下一个WatchKey
3. WatchKey take()
获取下一个WatchKey,如果没有WatchKey发生就一直阻塞等待
code:
复制代码
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
public class WatchServiceTest
{
public static void main(String[] args)
throws Exception
{
// 获取文件系统的WatchService对象
WatchService watchService = FileSystems.getDefault().newWatchService();
// 为C:盘根路径注册监听
Paths.get("C:/").register(watchService
, StandardWatchEventKinds.ENTRY_CREATE
, StandardWatchEventKinds.ENTRY_MODIFY
, StandardWatchEventKinds.ENTRY_DELETE);
while(true)
{
// 获取下一个文件改动事件
WatchKey key = watchService.take(); //①
for (WatchEvent< > event : key.pollEvents())
{
System.out.println(event.context() +" 文件发生了 " + event.kind()+ "事件!");
}
// 重设WatchKey
boolean valid = key.reset();
// 如果重设失败,退出监听
if (!valid)
{
break;
}
}
}
}
复制代码
0x8: 深度、高效、全面地访问文件属性
复制代码
import java.io.*;
import java.util.*;
import