【IT168 技术】本文是介绍 Java 7 中的 More New I/O APIs for Java (NIO.2) 的两部分文章的第二部分。 正如在 第一部分 中探索的异通道 API 一样, NIO.2 的文件系统用以前 Java 版本处理 I/O 的相关方法,填补了一些重大的空白。 依照 NIO.2 Java 规范要求(JSR 203):
Java 平台早就需要一个文件系统接口而不是 java.io.File 类。 该类不会在平台中以一贯的方式来处理文件名,它不支持高效文件属性访问,不允许复杂应用程序利用可用的文件系统特定特性(比如,符号链接), 而且,其大多数方法在出错时仅返回失败,而不会提供异常信息。
补救措施是 Java 7 试用版中的三个新的文件系统包:
java.nio.file
java.nio.file.attribute
java.nio.file.spi
本文重点关注这些包中最有用的类:
java.nio.file.Files
与java.nio.file.FileVisitor
使得您可以在文件系统中漫步,在特定目录深度查询文件或者目录,并可对每个查询结果执行用户实现的回调方法。java.nio.file.Path
与java.nio.file.WatchService
允许 “ 注册 ” 来监视特定目录。如果在目录中发生了文件创建、修改或者删除操作,监视目录的应用程序将收到通知。java.nio.attribute.*AttributeView
允许查看此前对于 Java 用户隐藏的文件和目录属性。这些属性包括文件所有者及组权限,访问控制列表(ACL),以及扩展文件属性。
本文将提供如何使用这些类的相关例子。 这些例子都处于可运行状态,您可在 Oracle 以及 IBM®(在本文写作期间,都还处于开发阶段;见 参见资料) 所提供的 Java 7 版中运行这些例子。
文件访问类
我们的第一个例子演示了新的 FileVisitor API。
设想一个场景,您想要递归地访问一个目录树,在该树中的每个文件及目录上停下来,并为每个查找到的条目调用您自己的回调方法。在以前的 Java 版本中,这可能是个很痛苦的过程,包括递归列出目录、检查其条目、并自己调用回调。在 Java 7 中,这些都在 FileVisitor 中有提供,使用起来非常简单。
第一步是实现您自己的 FileVisitor 类。这个类包含 file-visitor 引擎穿越文件系统时所调用的回调方法。FileVisitor 接口由 5 个方法组成,在此处以遍历其间被调用的典型顺序来列出(T 在此处代表 java.nio.file.Path 或者超类):
- 在访问目录中的条目之前调用
FileVisitResult preVisitDirectory(T dir)
。它返回一个FileVisitResult
枚举值,来告诉文件访问程序 API 下一步做什么。 - 当目录由于某些原因无法访问时,调用
FileVisitResult preVisitDirectoryFailed(T dir, IOException exception)
。在第二个参数中指出了导致访问失败的异常。 - 在当前目录中有文件被访问时,调用
FileVisitResult visitFile(T file, BasicFileAttributes attribs)
。该文件的属性传递给第二个参数。(可在本文文件属性部分更深入了解文件属性。) - 当访问文件失败时,调用
FileVisitResult visitFileFailed(T file, IOException exception)
。第二个参数指明导致访问失败的异常。 - 完成对目录及其子目录的访问后,调用
FileVisitResult postVisitDirectory(T dir, IOException exception)
。当目录访问成功时,异常参数为空,或者包含导致目录访问过早结束的异常。
为了节约开发人员的时间, NIO.2 提供了 FileVisitor 的实现接口:java.nio.file.SimpleFileVisitor。该类以基础方式获取:对于 *Failed() 方法,它只是重新引发该异常,并且对于其他方法,它会继续下去而根本不做任何事!它的作用在于,您可以使用匿名类来替代您所希望替代的方法;剩下的方法会按默认方式实现。
清单 1 展示如何创建一个 FileVisitor 实例的例子: