如果使用Files.find(),则为AccessDeniedException

时间:2019-07-15 18:16:57

标签: java unix java-8 stream access-denied

我需要在目录中找到所有匹配的文件并获取一些信息(例如,unix权限)。

如果我使用Files.find()方法尝试它,则可以正常工作,但是有些文件或目录会导致AccessDeniedException

例如

try (Stream<Path> stream = Files.find(Paths.get("/etc/cups/ssl"), 1, (p, bfa) -> true)) {
    stream.forEach(p -> {
    try {
        PosixFileAttributes attr = Files.readAttributes(p, PosixFileAttributes.class);
        System.out.println(attr.permissions());
    } catch (IOException e) {}
    });
}

返回:

Exception in thread "main" java.nio.file.AccessDeniedException: /etc/cups/ssl
    at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
    at java.base/sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:428)
    at java.base/java.nio.file.Files.newDirectoryStream(Files.java:471)
    at java.base/java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:300)
    at java.base/java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:322)
    at java.base/java.nio.file.FileTreeIterator.<init>(FileTreeIterator.java:71)
    at java.base/java.nio.file.Files.find(Files.java:3937)
    at unix.utils.UnixFile.main(UnixFile.java:2371)

 Process finished with exit code 1 

但是将Process和command与相同的文件一起使用可以正常工作

String[] command = { "/bin/sh", "-c", "/bin/ls -ldA /etc/cups/ssl" };
Process process = Runtime.getRuntime().exec(command);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
    System.out.println(line);
}

返回:

drwx------ 2 root lp 4096 Feb 16 16:48 /etc/cups/ssl

Process finished with exit code 0

使用Files.find()时出现异常的原因是什么?我不更改文件,不移动,只获取一些属性信息

1 个答案:

答案 0 :(得分:1)

我明白了问题所在。 当我使用该过程时,我仅获得目录属性,而未输入该属性。 但是在“文件”示例中,我不仅要获取目录,还尝试进入目录,因为将maxdepth设置为1。需要将maxdepth设置为0以仅检查此目录而不输入。