java - Files.walkFileTree 在 walk/proc 时在访问者方法之外抛出异常

标签 java nio

据我了解,使用 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 方法的默认行为是重新抛出异常。

您可能希望重写该方法来自己处理异常。

关于java - Files.walkFileTree 在 walk/proc 时在访问者方法之外抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28859241/

相关文章:

java - 当每个请求可能需要很长时间才能完成时,如何扩展 TCP 服务器?

java - Java 文件的单独构建步骤 - Maven

java - 在恒定时间内删除 HashMap 内的 List<String> 元素

java.nio.file 包未检测到目录更改

java - JAVA WatchService Overflow事件如何处理?

java - 如何在java7中为特定用户设置文件访问属性

java - IAIK PKCS#11 包装器无法初始化

java - 即使应用程序最小化,FusedLocationClient.requestLocationUpdates 也会继续获取更新吗?

java - 在模式中使用变量

java.nio channel 缓冲区流术语