簡體   English   中英

在walk / proc時,Files.walkFileTree會在訪問者方法之外拋出異常

[英]Files.walkFileTree throws exception outside visitor methods when walking /proc

據我所知,使用Files.walkFileTree遍歷文件樹時處理異常的常用方法是在訪問者實現中實現一些try / catch邏輯,例如通過靜默忽略任何AccessDeniedExceptions並轉移到其他文件。 但是我想我發現了一個調用來自訪問者代碼之外的異常的情況,這使得很難對它做任何事情。 結果是整個文件遍歷崩潰。 是的,它是在遍歷linux上的特殊/ proc文件系統時發生的。

在同一路徑上使用舊的Java API File.list(..)不會崩潰,它只是靜默地返回一個空列表。

我的問題是,有沒有辦法確保像這樣的權限問題不會中斷整個文件遍歷?

對於此特定目錄,我的用戶似乎是該文件夾及其所有內容的所有者,如下所示:

thomas.larsson@anonymized $ sudo ls -la /proc/2662/map_files
total 0
dr-x------ 2 thomas.larsson thomas  0 mar  4 09:44 .
dr-xr-xr-x 9 thomas.larsson thomas  0 mar  4 09:11 ..
lr-------- 1 thomas.larsson thomas 64 mar  4 12:39 7f67499df000-7f67499ea000 -> /lib/x86_64-linux-gnu/libnss_files-2.19.so
...

這讓我覺得我無法在preVisitDirectory方法中做任何事情,比如檢查PosixFileAttributes以確定我是否可以讀取這個目錄。

這是一個junit片段,可以為我重現問題

package com.apa;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class Example {

   @Test
   public void testWalk() throws IOException {
      Files.walkFileTree(Paths.get("/proc/2662/map_files"), new SimpleFileVisitor<Path>() {
          @Override
          public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
              System.out.println("Visiting " + file);
              return super.visitFile(file, attrs);
          }
      });
   }

   @Test
   public void oldApi() {
      String[] list = new File("/proc/2662/map_files").list();
   }
}

相應的堆棧跟蹤是:

java.nio.file.FileSystemException: /proc/2662/map_files: Operation not permitted
   at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
   at sun.nio.fs.UnixException.asIOException(UnixException.java:111)
   at sun.nio.fs.UnixDirectoryStream$UnixDirectoryIterator.readNextEntry(UnixDirectoryStream.java:171)
   at sun.nio.fs.UnixDirectoryStream$UnixDirectoryIterator.hasNext(UnixDirectoryStream.java:201)
   at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:198)
   at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:69)
   at java.nio.file.Files.walkFileTree(Files.java:2600)
   at java.nio.file.Files.walkFileTree(Files.java:2633)
   at com.klarna.filewatch.Example.walkTheWalk(Example.java:14)
   ...

最誠摯的問候/托馬斯

根據https://docs.oracle.com/javase/7/docs/api/java/nio/file/SimpleFileVisitor.html,visitFileFailed方法的默認行為是重新拋出異常。

您可能希望覆蓋該方法以自行處理異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM