存在をチェックをすることなく、壊れたシンボリックリンクを解決します

キリル:

私は私のJava Webアプリケーションに問題がある:それはエラーで数日後に失敗しましたFileSystemException: Too many open files私はそれが何を意味するかを理解し、私は近くにファイルしなかったところ、私は理解することはできません。このコードは、すべてのファイルディスクリプタ(およびデバッグ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()で失敗しNoSuchFileException、ここで、Path.toFile().getCanonicalPath()このようなリンクを無視し、ターゲットは表示されません。唯一のシステムがls -l /proc/$pid/fd/正常に動作し、すべてのリンクを解決します。

それは、Java(1.8 JDK)を使用して、このようなリンクを解決することは可能ですか?

ダニエルJunglas:

答えに私のコメントを参照すると、私は、ファイルが死んでシンボリックリンクであるかどうかを把握するために、2つのオプションを見ることができます:

  1. 使用Files.readSymbolicLink()して、ターゲットが存在するかどうかを確認してください。
  2. 使用Files.exists()異なるオプションで:ファイルが存在している場合でNOFOLLOW_LINKSはなく、それがシンボリックリンクである必要があり、そのオプションなしでは存在しません。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=375039&siteId=1