Java7 对原有的 NIO 进行了重大改进,叫 NIO.2。

其中之一就是提供了全面的文件 IO 和文件系统访问支持,新增了 java.nio.file 包及各个子包。

NIO.2 引入了 Path 接口,Path 接口代表一个平台无关的平台路径;还提供了 Files、Paths 两个工具类,Files 包含了大量静态的工具方法来操作文件,Paths 则包含了两个返回 Path 的静态工厂方法。

这边我记录下以上几个的用法 sample,以后用得着。

  • Path 接口的功能和用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* Path接口的功能和用法
*/
//以当前路径创建Path对象
Path path = Paths.get(".");
System.out.println("Paths.get(\".\"):" + path);
System.out.println("path的路径数量:" + path.getNameCount());
System.out.println("path的根路径:" + path.getRoot());
System.out.println("path的绝对路径:" + path.toAbsolutePath());
System.out.println("AbsolutePath的根路径:" + path.toAbsolutePath().getRoot());
System.out.println("AbsolutePath的路径数量:" + path.toAbsolutePath().getNameCount());
System.out.println("path.toAbsolutePath().getName(3):" + path.toAbsolutePath().getName(3));

//以多个string构建path对象
//相当于e:\Workspace\IDEA,超方便有木有
Path path2 = Paths.get("e:", "Workspace", "IDEA");
System.out.println("Paths.get(\"e:\", \"Workspace\", \"IDEA\"):" + path2);
  • Files 类的用法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Files类的用法
*/
Path path3 = Paths.get("pwd.txt");
//复制文件
Files.copy(path3, new FileOutputStream("copy.txt"));
//判断是否为隐藏文件
System.out.println("pwd.txt是否为隐藏文件:" + Files.isHidden(path3));
//一次性读取文件的所有行
List<String> lines = Files.readAllLines(path3, Charset.forName("gbk"));
System.out.println(lines);
//判断指定文件的大小
System.out.println("pwd.txt大小为:" + Files.size(path3));
//将多个字符串内容写入指定文件中
List<String> poem = new ArrayList<String>();
poem.add("举头望明月");
poem.add("低头思故乡");
Files.write(Paths.get("poem.txt"), poem, Charset.forName("utf-8"));
//判断C盘的总空间、可用空间
FileStore fileStore = Files.getFileStore(Paths.get("C:"));
System.out.println("C盘总空间:" + fileStore.getTotalSpace());
System.out.println("C盘可用空间:" + fileStore.getUsableSpace());

Files 工具类真心简单,原本需要通过 IO 操作才能完成的功能,现在 Files 类只要一个工具方法即可。

  • 使用 FileVisitor 遍历文件和子目录

在之前的 java 版本中,遍历指定目录下的所有文件和子目录只能使用递归。有了 Files 工具类的帮助,遍历文件和子目录就方便的多了。Files 类主要使用 walkFileTree()来遍历。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 使用FileVisitor遍历文件和子目录
*/
//遍历E:\Workspace\AndroidStudio目录下的所有文件和子目录
Files.walkFileTree(Paths.get("E:", "Workspace", "AndroidStudio"), new SimpleFileVisitor<Path>() {
//访问文件时触发
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("正在访问" + file + "文件");
//找到了MainActivity.java
if (file.endsWith("MainActivity.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;
}
});

(完)

参考自《疯狂 JAVA 讲义》