Java 在不检查是否存在的情况下解析断开的符号链接
我的Java webapp有一个问题:它在几天后失败,出现错误Java 在不检查是否存在的情况下解析断开的符号链接,java,linux,symlink,file-descriptor,Java,Linux,Symlink,File Descriptor,我的Java webapp有一个问题:它在几天后失败,出现错误FileSystemException:打开的文件太多。我明白这意味着什么,但我不知道我在哪里没有关闭文件。因此,我试图编写一些调试代码来帮助我找到此错误的原因:此代码应该返回所有文件描述符(并通过调试http端点显示): Files.list(path.get(String.format(“/proc/$d/fd”,pid)).map( fd->String.format( “%s:%s”, fd.getFileName(), //
FileSystemException:打开的文件太多
。我明白这意味着什么,但我不知道我在哪里没有关闭文件。因此,我试图编写一些调试代码来帮助我找到此错误的原因:此代码应该返回所有文件描述符(并通过调试http端点显示):
Files.list(path.get(String.format(“/proc/$d/fd”,pid)).map(
fd->String.format(
“%s:%s”,
fd.getFileName(),
//我还尝试了fd.toRealPath()
fd.toFile().getCanonicalFile()
)
).collect(收集器.toList())
但此代码不显示断开的链接(删除目标的符号链接)Path.toRealPath()
失败,出现NoSuchFileException
此处,Path.toFile().getCanonicalPath()
忽略此类链接,不显示目标。只有系统ls-l/proc/$pid/fd/
工作正常并解析所有链接
是否可以使用Java(1.8 JDK)解析此类链接?将我的评论转换为答案,我可以看到两个选项来确定文件是否为死符号链接:
Files.readSymbolicLink()
,然后检查目标是否存在Files.exists()
:如果文件存在时带有NOFOLLOW\u链接,但不存在没有该选项的文件,则该文件应为悬挂符号链接
如果
toRealPath()
在断开的链接上始终失败,那么为什么不捕获异常并使用它来检测链接是否正常?自从我尝试在Java中使用符号链接以来,已经有很长一段时间了,当时这是一场噩梦,因为Java不支持符号链接。也许事情变了,但因为这只是为了调试,所以使用异常就可以了?顺便说一下,有一些工具可以查找泄漏的文件描述符,例如valgrind。valgrind使用Java并不容易,但可能有类似的Java工具?刚刚发现您可以读取Java中符号链接的目标,请参阅@DanielJunglas,谢谢,这是文件。readSymbolicLink
函数运行良好。