Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不检查是否存在的情况下解析断开的符号链接_Java_Linux_Symlink_File Descriptor - Fatal编程技术网

Java 在不检查是否存在的情况下解析断开的符号链接

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(), //

我的Java webapp有一个问题:它在几天后失败,出现错误
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
    函数运行良好。