Java7中 的I/O库得到了进一步增强,成为NIO.2 。 NIO.2 中包含的主要内容包括文件系统访问和异步I/O通道.
Java 7 加强了文件操作相关的功能,使用java.nio.file包的类实现。
1.文件路径的抽象:Path 类
(1)创建Path:
Path path1 = Paths.get("E:\\book\\"); //创建path
Path path2 = Paths.get("java\\1.txt");
Path p2 = Paths.get(filename);
Path p3 = Paths.get(URI.create("C://File.java"));
(2)获取path信息
Path path = Paths.get("D:\\Program Files\\Java\\text.txt");
System.out.format("toString: %s%n", path.toString()); //D:\Program Files\Java\text.txt
System.out.format("getFileName: %s%n", path.getFileName()); //text.txt
System.out.format("getName(0): %s%n", path.getName(0)); //Program Files
System.out.format("getNameCount: %d%n", path.getNameCount()); //3
System.out.format("subpath(0,2): %s%n", path.subpath(0,2)); // Program Files\Java
System.out.format("getParent: %s%n", path.getParent()); // D:\Program Files\Java
System.out.format("getRoot: %s%n", path.getRoot()); //D:\
(3)连接两个path:
(1)当被连接的 path 不包含的根路径时,会直接将此 path 连接到原 path 后面,如下:
Path path3 = path1.resolve(path2); //把path1当成父目录解析;
Path path4 = path1.resolveSibling(path2);//把path1的父目录当成父目录解析
System.out.println(path3.toString());//E:\book\java\1.txt
System.out.println(path4.toString());//E:\java\1.txt
(2)当被连接的 path 包含根路径时,resolve()h会返回此 path 对象:
System.out.println(path2.resolve("E:\\"));//E:\
(4) path 转换
1)将 path 转换为 uri,使用Path.toUri() 方法,Path转换为可以在浏览器中打开的字符串格式,如下:
System.out.format("%s%n", path1.toUri());//file:///E:/book/
2)toAbsolutePath 转换为绝对路径:
System.out.println(path2.toAbsolutePath());//E:\workspace\javass\java\1.txt
3) toFile() 转换为文件
(5)判断文件或目录是否存在:
2.文件目录列表流:DirectoryStream<Path>
Path path = Paths.get(".");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
for (Path entry : stream) {
System.out.println(entry.toString());
}
}
3.文件目录树遍历
public class DemoFileVisitor extends SimpleFileVisitor<Path>{
public FileVisitResult preVisitDirectory(Path dir,BasicFileAttributes attrs){
System.out.println("准备访问目录:" + dir.toString());
return FileVisitResult.CONTINUE;
}
public FileVisitResult postVisitDirectory(Path dir , IOException e){
System.out.println("目录:" + dir.toString() + " 访问完成");
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){
System.out.println("正在访问文件:" + file.getFileName());
return FileVisitResult.CONTINUE;
}
public static void main(String[] args) throws IOException{
DemoFileVisitor dfv = new DemoFileVisitor();
Files.walkFileTree(Paths.get("."), dfv);
}
}
4.监视目录变化
java 7 提供了监视目录变化服务,使用该服务可以指定目录中内容的创建,修改和删除的事件通知。
public static void watchFile() throws IOException, InterruptedException {
WatchService service = FileSystems.getDefault().newWatchService();//创建监视服务
Path path = Paths.get("").toAbsolutePath();
//注册监视服务,监视create 和修改事件
path.register(service, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY);
System.out.println("watch path :" + path.toString());
boolean flag = true;
while (flag) {
//通过watchkey 获得事件通知
WatchKey key = service.take();
for (WatchEvent<?> event : key.pollEvents()) {
Path createdPath = (Path) event.context();
createdPath = path.resolve(createdPath);
long size = Files.size(createdPath);
System.out.println(createdPath + " ==> " + size);
flag = false;
}
}
}