我想我会分享一些我在处理这个问题时的好运气。我使用的是 JDK 1.6.0_23,所以我无法从 NIO2 中受益。我仅在 Windows 7 /x64 上构建和运行,因此里程在其他环境中可能会有所不同。不幸的是,这里的其他解决方案在避免尝试遍历联结时引起的 NullPointerExceptions 对我不起作用(可能是因为 junction != symlink ....)。虽然我不受 JDK 版本的限制,但我决定在这个问题上再坚持一段时间。
我有这段代码,如果在符号链接上使用或遇到“系统卷信息”目录时会导致 NullPointerException。(注意,traverseItem.f() 返回一个 java.io.File 类型的对象)
if (traverseItem.f().isDirectory) {
for (File item : traverseItem.f().listFiles()) {
因此,它应该是一个目录,但在其上调用 listFiles() 会导致 NPE。该怎么办?我发现了 list() 方法,想知道它是否会表现出相同的行为。我发现如下:
对描述空文件夹的 File 调用 list() 会返回一个长度为零的 String[] 数组。但是,在描述一个结点的文件上调用 list(),否则该结点会从 listFiles() 崩溃返回 null
通过在调用 listFiles() 之前添加以下测试,我能够避免 NullPointerExceptions
String[] contents = traverseItem.f().list();
if (contents != null) { //Non-traversible if null, possibly junction or ???
仍然需要详尽地测试连接、符号链接、硬链接的所有情况,我敢提它,快捷方式,但这可能会有所帮助。