Java NIO、NIO.2学习笔记(五)
nnel())
{
// 使用非阻塞式方式对指定文件加锁
FileLock lock = channel.tryLock();
// 程序暂停10s
Thread.sleep(10000);
// 释放锁
lock.release();
}
}
}
复制代码
从以上代码可以看到,在这10秒内,其他程序无法对a.txt进行修改
0x5: Path、Paths、Files
path
复制代码
import java.io.*;
import java.net.*;
import java.nio.file.*;
public class PathTest
{
public static void main(String[] args)
throws Exception
{
// 以当前路径来创建Path对象
Path path = Paths.get(".");
System.out.println("path里包含的路径数量:" + path.getNameCount());
System.out.println("path的根路径:" + path.getRoot());
// 获取path对应的绝对路径。
Path absolutePath = path.toAbsolutePath();
System.out.println(absolutePath);
// 获取绝对路径的根路径
System.out.println("absolutePath的跟路径:" + absolutePath.getRoot());
// 获取绝对路径所包含的路径数量
System.out.println("absolutePath里包含的路径数量:" + absolutePath.getNameCount());
System.out.println(absolutePath.getName(3));
// 以多个String来构建Path对象
Path path2 = Paths.get("g:" , "publish" , "codes");
System.out.println(path2);
}
}
复制代码
Files
复制代码
import java.nio.file.*;
import java.nio.charset.*;
import java.io.*;
import java.util.*;
public class FilesTest
{
public static void main(String[] args) throws Exception
{
// 复制文件
Files.copy(Paths.get("FilesTest.java") ,new FileOutputStream("out.txt"));
// 判断FilesTest.java文件是否为隐藏文件
System.out.println("FilesTest.java是否为隐藏文件:" + Files.isHidden(Paths.get("FilesTest.java")));
// 一次性读取FilesTest.java文件的所有行
List lines = Files.readAllLines(Paths.get("FilesTest.java"), Charset.forName("gbk"));
System.out.println(lines);
// 判断指定文件的大小
System.out.println("FilesTest.java的大小为:" + Files.size(Paths.get("FilesTest.java")));
List poem = new ArrayList<>();
poem.add("水晶潭底银鱼跃");
poem.add("清徐风中碧竿横");
// 直接将多个字符串内容写入指定文件中
Files.write(Paths.get("pome.txt") , poem, Charset.forName("gbk"));
FileStore cStore = Files.getFileStore(Paths.get("C:"));
// 判断C盘的总空间,可用空间
System.out.println("C:共有空间:" + cStore.getTotalSpace());
System.out.println("C:可用空间:" + cStore.getUsableSpace());
}
}
复制代码
从代码可以看出,Files类是一个高度封装的工具类,它提供了大量的工具方法来完成文件复制、读取文件内容、写入文件内容等功能,简化原本的文件IO代码量
0x6: FileVisitor
在传统的java.io.File文件类的模式下,如果我们想要遍历指定目录下的所有文件和目录,则只能使用递归进行遍历,有了NIO的Files类的帮助,程序员可以采用更优雅的方式来遍历文件和子目录,Files类提供了如下两个方法来遍历文件和子目录
1. walkFileTree(Path start, FileVisitor< super Path> visitor);
遍历start路径下的所有文件和子目录
2. walkFileTree(Path start, Set options, int maxDepth, FileVisitor< super Path> visitor);
作用和1一样,增加了控制遍历深度的maxDepth参数
这两个方法都需要FileVisitor参数,FileVisitor代表一个"文件访问器",walkFileTree()方法会自动遍历start路径下的所有文件和子目录,遍历文件和子目录都会"触发"(回调的思想)FileVisitor中相应的方法
复制代码
1. FileVisitResult postVisitDirectory(T dir, IOException exc)
访问子目录之后触发该方法
2. FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
访问子目录前触发该方法
3. FileVisitResult visitFile(T file, BasicFileAttributes attrs)
访问file文件时触发该方法
4. FileVisitResult visitFileFailed(T file, IO