= GEP-6: Groovy 的 NIO2 支持 :icons: font .元数据 **** [horizontal,options="compact"] *编号*:: GEP-6 *标题*:: Groovy 的 NIO2 支持 *版本*:: 2 *类型*:: 特性 *状态*:: 最终 *备注*:: 在 Groovy 2.3 中交付 *负责人*:: Merlyn Albery-Speyer/Hamlet D'Arcy *创建日期*:: 2010-09-25 *最后修改日期* :: 2018-10-12 **** == 摘要 JDK 7 包含一个新的 `java.nio.file` 包和 `Path` 类。这些提供了文件系统任务的扩展功能。我们应该探索将其集成到 Groovy 中。 == 方法 我提议: * 创建一个 Groovy 的 openjdk7 构建 * 暂时将 NIO2 支持移至 Groovy 模块 * 当 JDK7 正式发布时,将 NIO2 Groovy 模块移至 Groovy-core JDK7 仍处于测试阶段。它可能会发生变化。如果我们在今天将 NIO2 支持构建到 Groovy 中并发布,那么我们就有可能面临 JDK7 做出 API 更改的风险,这将迫使我们支持两种不同的 API。这将是很糟糕的。 === Groovy NIO 模块中的待办事项: * 支持新的 `Path` 对象 * 所有 GDK File API 都需要支持 `Path` * NIO2 包含一个新的 `WatchService` API。我们可能需要为 `WatchService` 提供一个 GDK,以便使用闭包等轻松地进行操作。在我看来,这是最有趣的工作。 === Groovy Core 中的待办事项: Groovy 有 `FileNameFinder` 和 `FileNameRegExFinder`。这些也需要与 `Paths` 一起工作:http://mrhaki.blogspot.com/2009/11/groovy-goodness-finding-files-with.html 我还没有查看此列表中的每个文件,但我们需要分析这些 Groovy 源文件,看看是否需要任何并行的 `Path` 实现。前 3 个文件看起来是最重要的: ``` ./groovy/util/IFileNameFinder.java ./groovy/io/FileType.java ./groovy/io/FileVisitResult.java ./org/codehaus/groovy/runtime/WritableFile.java ./org/codehaus/groovy/ant/FileIterator.java ./org/codehaus/groovy/ant/FileScanner.java ./org/codehaus/groovy/control/io/FileReaderSource.java ``` 我无法在 Groovy-core 中找到任何实例,但任何 `asType(File)` 方法都需要一个并行的 `asType(Path)` - 我相信 `asWritable(Path)` 是唯一需要的更改。 在 NIO2 中,我相信 `File.list` 和另一个方法现在返回一个迭代器,这使得此方法在网络上更好地工作。我们需要更新 File GDK,默认使用这种方法,以支持网络目录或类似 ls 风格的列表。 NIO2 有一个新的 `FileVisitor` 类。我们需要将这个新的 `FileVisitor` JDK 方法与 Groovy 今天在 GDK 中使用 `.eachFile` 方法所做的工作统一起来。除了 `.eachFileXXX` 方法和 `.eachDirXXX` 方法之外,在寻找潜在的统一位置时,我们还应该包括 `.traverse` 方法。 `.traverse` 方法的主要作用是在 JDK 7 之前的世界中提供一些类似 `FileVisitor` 的功能,但 NIO2 的存在可能会开启更多可能性。当时还有一些想法是提供更多带有静态类型风格的重载遍历方法,而不仅仅是当前的 Map 解决方案。我想现在也是考虑该选项的好时机。 == 参考和有用链接 === 邮件列表讨论 * https://marc.info/?l=groovy-dev&m=128540553001110&w=2[groovy-dev: OpenJDK 7 Groovy 构建和 NIO2 支持] * https://docs.oracle.com/javase/8/docs/technotes/guides/io/index.html[Java I/O, NIO 和 NIO.2] === JIRA 问题 * https://issues.apache.org/jira/browse/GROOVY-4390[GROOVY-4390: 将 GDK File 方法添加到 NIO2 API] * https://issues.apache.org/jira/browse/GROOVY-4391[GROOVY-4391: Groovy 构建在使用 Java 1.7.0 时测试目标失败] == 更新历史 1 (2010-02-16):: 从 Codehaus wiki 提取的版本 2 (2018-10-14):: 大量细微调整

GEP-6