解决断开的符号链接而不检查是否存在

Resolve broken symbolic links without checking for existance

我的 Java webapp 有问题:它在几天后失败并出现错误 FileSystemException: Too many open files。我明白它的意思,但我想不通我没有关闭文件的地方。所以我试图编写一些调试代码来帮助我找到这个错误的原因:这段代码应该 return 所有文件描述符(并通过调试 http 端点显示):

Files.list(Paths.get(String.format("/proc/$d/fd", pid))).map(
  fd -> String.format(
    "%s:%s",
    fd.getFileName(),
    // also I tried fd.toRealPath()
    fd.toFile().getCanonicalFile()
  )
).collect(Collectors.toList())

但此代码不显示损坏的链接(目标已删除的符号链接)。 Path.toRealPath() 在这里失败并显示 NoSuchFileExceptionPath.toFile().getCanonicalPath() 忽略此类链接并且不显示目标。只有系统 ls -l /proc/$pid/fd/ 可以正常工作并解析所有链接。

是否可以使用 Java (1.8 JDK) 解析此类链接?

将我的评论变成答案,我可以看到两个选项来确定文件是否是死符号 link:

  1. 使用Files.readSymbolicLink()然后检查目标是否存在
  2. 使用具有不同选项的 Files.exists():如果文件存在 NOFOLLOW_LINKS 但没有该选项则不存在,那么它应该是一个悬空符号 link.