Java 7 - LinkOption - 为什么只有NOFOLLOW_LINKS这个选项可用?

7

我认为标题已经说明了一切。我该如何指定FOLLOW_LINKS?为什么要创建一个只有一个选项的枚举?例如,方法java.nio.file.Files.getLastModifiedTime(Path, LinkOption...)接受LinkOption-s数组作为参数。你必须传递一些东西,但你只能传递一个可用的选项。这让我感到惊讶,想更多地了解它。


2
当然,允许任意数量的选项可以在不需要更改API的情况下进行未来扩展。 - Holger
3个回答

4

默认情况下,链接是会被跟踪的。也就是说,如果您没有指定NOFOLLOW_LINKS,则会跟踪链接。

来自Files.getLastModifiedTime()方法的文档(强调我的):

可以使用选项数组来指示如何处理符号链接,以防文件是符号链接的情况。 默认情况下,将跟随符号链接并读取链接的最终目标文件的文件属性。 如果存在NOFOLLOW_LINKS选项,则不会跟随符号链接。


是的,经过一段时间在其他nio领域的搜索后,我发现“复制符号链接时,会复制链接的目标。如果您想复制链接本身而不是链接的内容,请指定NOFOLLOW_LINKS或REPLACE_EXISTING选项。”这解释了LinkOption枚举的存在。我不知道为什么我没有首先查看Files.getLastModifiedTime()文档。 - Peter Perháč
如果LinkOption文档提到了在使用LinkOption的调用中,遵循链接是默认行为,那么这似乎会有所裨益。 - matts
另一个问题是,当我查看getLastModifiedTime()的Javadocs时,我没有阅读顶部的“执行摘要”,而是直接跳转到参数部分,那里只写着:“options-指示如何处理符号链接的选项”。因此,我无法理解为什么我的唯一选择似乎是不跟随符号链接。现在一切都清楚了 :-) 谢谢 - Peter Perháč

1

让我有点困惑的是,Files.exists()方法的LinkOptions参数是可变参数,这一事实我没有立即意识到...你可以将其省略。将其设置为null会导致异常。


1
许多NIO.2方法在传递选项时使用varargs,即使只有一个枚举值可用。这种方法的优点是未来性。与仅传递布尔参数不同,这些方法签名不受将来可用选项的Java语言更改的影响。引自“OCP Oracle Certified Professional Java SE 11 Programmer II”一书。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接