Software_programming_java_core_Files_Paths
19:00:08
1 递归删除 FilsWalkTree , FileVisitorResult
walkFileTree 方法需要 FileVisitor 接口的实例, file visitor 会得到通知的时机
1. 目录处理之前
FileVisitorResult preVisitDirectory (T dir, IOException ex)
2. 当遇到一个文件或目录时
FileVisitorResult visitFile ( T path, BasicFileAttributes attrs )
3. 当 visitFile 方法发生异常时
FileVisitResult visitFileFailed ( T path, IOException ex )
4. 目录被处理之后
FileVisitResult postVisitDirectory (T dir, IOException ex)
在每个时机, 通知方法返回下列方法之一:
1. FileVisitResult.CONTINUE 继续访问下一个文件
2. FileVisitResult.SKIP_SUBTREE 继续轮询,但不会访问该目录的子项
3. FileVisitResult.SKIP_SUBLINGS 继续轮询,但不要访问该目录的同级项
4. FileVisitResult.TERMINATE 终止轮询
如果任何方法抛出异常,轮询也会终止,并且该异常从 walkFileTree方法抛出。
SimpleFileVisitor 类实现了这个接口,会在每个点持续迭代以及转抛任何异常。
删除一个目录树的示例:
Files.walkFileTree( path, new SimpleFileVisitor<Path>() {
public FileVisitResult visitFile( Path file, BasicFileAttributes attrs ) throw IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
public FileVisitResult postVisitDirectory (Path dir, IOException ex) throws IOException {
if ( ex != null ) throw ex;
Files.delete ( dir );
return FileVisitResult.CONITUE;
}
});
Files.list 返回一个读取目录项的 Stream(Path) 对象, 目录读取时延迟的,目的时尽可能高效地
处理含有大量目录项的目录
try(Stream<Path> entries = Files.list(pathToDirectory)) {
}
读取目录会占用需要关闭的系统资源,需要使用 try
list 不会进入子目录,要出一个目录的所有子目录, Files.walk
try(Stream<Path> entries = Files.walk(pathToRoot)) {
// 包含所有的子目录和文件, 按深度优先次序访问
}
对walk返回的目录进行过滤,且过滤标准涉及文件属性,如 大小,创建时间 类型
要使用 find 方法而不是 walk 方法,使用一个接收路径和 BasicAttributes对象的判定函数来调用find,
唯一好处是效率高,因为目录已经被读取,相关属性可用。
============================================================
Path tempFile = Files.createTempFile(dir, prefix, suffx);
Path tempFile = Files.createTempFile(prefix, suffix);
Path tempDir = Files.createTempDirectory(dir, prefix);
Path tempDir = Files.createTempDirectory (prefix);
dir 是路径; prefix / suffix / Files.createTempFile(null, " .txt") 也可。
相关文件属性,例如原子性操作, todo: