精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-13
转自 开发者的天空
在有些时候,我们可能需要遍历整个目录树,例如需要寻找所有的.java文件。Java
SE
7提供了很方便的方法来实现这类的功能。 import static java.nio.file.FileVisitResult.*; public static class PrintFiles extends SimpleFileVisitor<Path> { //Print information about each type of file. @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attr) { if (attr.isSymbolicLink()) { System.out.format("Symbolic link: %s ", file); } else if (attr.isRegularFile()) { System.out.format("Regular file: %s ", file); } else { System.out.format("Other: %s ", file); } System.out.println("(" + attr.size() + "bytes)"); return CONTINUE; } //Print each directory visited. @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) { System.out.format("Directory: %s%n", dir); return CONTINUE; } //If there is some error accessing the directory, let the user know. //If you don't override this method and an error occurs, an IOException //is thrown. @Override public FileVisitResult preVisitDirectoryFailed(Path dir, IOException exc) { System.err.println(exc); return CONTINUE; } //If there is some error accessing the file, let the user know. //If you don't override this method and an error occurs, an IOException //is thrown. @Override public FileVisitResult visitFileFailed(Path file, IOException exc) { System.err.println(exc); return CONTINUE; } } 我
们需要的类已经创建好了,下面我们来看看怎样使用这个类。要遍历一个目录有两个方法可以调用,第一个方法仅仅需要传入目录的起点和FileVisitor
的 Path startingDir = ...; PrintFiles pf = new PrintFiles(); Files.walkFileTree(startingDir, pf); 第二个方法可以允许我们指定要访问的层数和一组
FileVisitOption作为参数。如果要调用该方法,又想确保整个目录树都被遍历,可以传入Integer.MAX_VALUE作为访问层数的参
数。可以使用的FileVisitOption枚举量有: import static java.nio.file.FileVisitResult.*; Path startingDir = ...; EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS); Finder finder = new Finder(pattern); Files.walkFileTree(startingDir, opts, Integer.MAX_VALUE, finder); 在
遍历目录树的时候是深度优先的。但是在同一级的目录中,我们无法判断哪个会先被访问。如果你的程序要修改文件系统,那么在实现FileVisitor的时
候就需要认真考虑。 public FileVisitResult visitFile(Path file, BasicAttributes attrs) { //It's a circular reference! if (attrs.isDirectory()) { ... return CONTINUE; } //It's a file. ... return CONTINUE; } 可
能我们需要的功能是遍历整个目录树来查找特定的目录。当查找到之后就结束。也有可能我们遍历目录树的时候希望跳过某些目录。我们可以通过这些方法的返回值
来控制程序执行的流程。 import static java.nio.file.FileVisitResult.*; public FileVisitResult preVisitDirectory(Path dir) { (if (dir.getName().toString().equals("SCCS")) { return SKIP_SUBTREE; } return CONTINUE; } 下 面的代码中,一旦特定名称的文件被找到,离开终止遍历操作。 import static java.nio.file.FileVisitResult.*; //The file we are looking for. Path lookingFor = ...; public FileVisitResult visitFile(Path file, BasicFileAttributes attr) { if (file.getName().equals(lookingFor)) { System.out.println("Located file: " + file); return TERMINATE; } return CONTINUE; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-15
新的api,还没用过呢。不知道好不好用
|
|
返回顶楼 | |
发表时间:2010-04-15
楼主你这个是不是有打广告之嫌,不过你那个论坛看起来实在 是不感恭维啊。界面看起来极为不舒服,虽然用的是成熟的论坛系统,但是怎么看怎么感觉山寨。
|
|
返回顶楼 | |
浏览 3833 次