与java无关,与你的linux安装有关:
选项 1:此目录上没有 Unix UGO x 权限。
进程无法查看/usr 目录。最有可能的是,该进程以用户X 运行,该用户在组[Y] 中(可以是多个!)。
/usr 目录肯定不归 X 所有(在所有相关的 unix 发行版上,它归 root 所有)。 /usr 的组所有者也很可能是 [Y] 集合中的任何内容;在大多数 linuxen 上,它是组 root,除了 root 本身之外,没有其他用户属于该组。
因此,访问权限的最后 3 个字母适用(它是用户/组/其他)。因此,运行ls -lah / 并检查/usr 的访问权限。我期望:
drwxr-xr-- 10 root root 4.0K Jan 1 2021 usr
请注意末尾的r--。没有x 意味着甚至没有权利查看它。这可以解释你所看到的。
请注意,这与 /usr/local 的访问权限无关!要读取目录,您需要访问整个“堆栈”,通常阻止您的目录仍然是,本身,对你可见——只是你不能删除或移动它,不能运行或打开其中的任何东西,甚至不能ls它。因此,您甚至无法“看到”/usr/local 这一事实表明,如果它完全是 UGO 访问,则不是/usr/local,而是/usr 或/。
选项 2:ACL 覆盖权限
一些发行版(尤其是 mac OS X)在标准的 unixy 用户/组 + UGO 权限系统之上添加了一层访问权限。例如,在 mac OS 中,您需要转到系统偏好设置窗格并转到“隐私”,并在此处添加一些磁盘访问权限。我不确定薄荷是否有类似的系统。可能不会,尤其是/usr,这是一个相当重要的。
选项 3:奇怪的东西
您正在使用不应再使用的过时 Java API。这个 API 的缺点之一是它不能给你关于东西的信息,它只能返回布尔值。因此,请尝试使用新的 API,如果您遇到错误,因为如果您这样做了,它会提供更多帮助:很多:它将有很多文字向您解释:
(首先检查 /usr/bin/man 是否存在;它应该存在。如果不存在,请选择您在那里找到的任何其他现有东西)。
import java.nio.file.*;
class Test {
public static void main(String[] args) throws Exception {
Path p = Paths.get("/usr/bin/man"); // I assume this exists.
byte[] b = Files.readAllBytes(p);
System.out.println("size of man exe: " + b.length);
}
}
这会抛出一些东西(或者如果它没有,嘿,还有其他问题,因为这个测试应用程序没有问题!) - 该异常的文本会告诉你一些有用的东西。
选项 4:呃
您的磁盘已损坏。让我们希望这不是它:P