/usr/local 和我的 Java 程序无法识别子文件夹
/usr/local and subfolders are not recognized by my Java program
我有一个 64 位 Linux Mint 20.1 OS,我意识到我的任意 Java 程序无法识别“/usr/local”或其中的任何内容作为现有实体。为了阐明我的意思,我在下面举了几个例子:
System.out.println(new File("/usr").exists()); //prints true
System.out.println(new File("/usr/local").exists()); //prints false
System.out.println(new File("/usr/local/bin").exists()); //prints false
System.out.println(new File("/usr/local/random-file-1").exists());
//prints false, regardless of whether that file exists
我检查了 /usr/local 的权限,假设那里可能有问题,但奇怪的是,我没有发现任何问题:
你能给梨形造型的两分钱吗?
与 java 无关,与您的 linux 安装有关:
选项 1:此目录没有 Unix UGO x 权限。
该进程无法查看 /usr
目录。最有可能的是,进程 运行 作为用户 X
,在组 [Y]
中(可以是多个!)。
/usr
目录肯定不属于 X
(在所有相关的 unix 发行版上,它属于 root
)。 /usr
的群组所有者也可能是 [Y]
集合中的任何内容;在大多数 linuxen 上,它是组 root
,除了 root
本身,没有用户属于该组。
因此,访问权限的最后 3 个字母适用(即 user/group/others)。因此,运行 ls -lah /
并检查 /usr
的访问权限。我预计:
drwxr-xr-- 10 root root 4.0K Jan 1 2021 usr
注意最后是r--
。 no x
意味着没有权利查看它。那可以解释你所看到的。
请注意 这与 /usr/local! 的访问权限无关 要阅读目录,您需要访问整个 'stack',并且在一般来说,阻止你的目录本身仍然对你可见 - 只是你不能删除或移动它,不能 运行 或打开其中的任何东西,甚至不能 ls
它。因此,你甚至不能 'see' /usr/local
的事实表明,如果它是 UGO 访问,它不是 /usr/local
,而是 /usr
或 /
.
选项 2:ACL 覆盖权限
一些发行版(特别是 mac OS X)在标准 unixy user/group + UGO 权限系统之上添加了一层访问权限。例如,在mac OS 中,您需要进入系统首选项面板并进入'privacy',并在此处添加一些磁盘访问权限。我不确定 mint 是否有类似的系统。可能不是,特别是对于 /usr
这是一个相当重要的问题。
选项 3:奇怪的东西
您使用的是不应该再使用的过时 java API。这个 API 的缺点之一是它不能给你关于东西的信息,它只能 return 布尔值。所以,尝试使用新的 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
我有一个 64 位 Linux Mint 20.1 OS,我意识到我的任意 Java 程序无法识别“/usr/local”或其中的任何内容作为现有实体。为了阐明我的意思,我在下面举了几个例子:
System.out.println(new File("/usr").exists()); //prints true
System.out.println(new File("/usr/local").exists()); //prints false
System.out.println(new File("/usr/local/bin").exists()); //prints false
System.out.println(new File("/usr/local/random-file-1").exists());
//prints false, regardless of whether that file exists
我检查了 /usr/local 的权限,假设那里可能有问题,但奇怪的是,我没有发现任何问题:
你能给梨形造型的两分钱吗?
与 java 无关,与您的 linux 安装有关:
选项 1:此目录没有 Unix UGO x 权限。
该进程无法查看 /usr
目录。最有可能的是,进程 运行 作为用户 X
,在组 [Y]
中(可以是多个!)。
/usr
目录肯定不属于 X
(在所有相关的 unix 发行版上,它属于 root
)。 /usr
的群组所有者也可能是 [Y]
集合中的任何内容;在大多数 linuxen 上,它是组 root
,除了 root
本身,没有用户属于该组。
因此,访问权限的最后 3 个字母适用(即 user/group/others)。因此,运行 ls -lah /
并检查 /usr
的访问权限。我预计:
drwxr-xr-- 10 root root 4.0K Jan 1 2021 usr
注意最后是r--
。 no x
意味着没有权利查看它。那可以解释你所看到的。
请注意 这与 /usr/local! 的访问权限无关 要阅读目录,您需要访问整个 'stack',并且在一般来说,阻止你的目录本身仍然对你可见 - 只是你不能删除或移动它,不能 运行 或打开其中的任何东西,甚至不能 ls
它。因此,你甚至不能 'see' /usr/local
的事实表明,如果它是 UGO 访问,它不是 /usr/local
,而是 /usr
或 /
.
选项 2:ACL 覆盖权限
一些发行版(特别是 mac OS X)在标准 unixy user/group + UGO 权限系统之上添加了一层访问权限。例如,在mac OS 中,您需要进入系统首选项面板并进入'privacy',并在此处添加一些磁盘访问权限。我不确定 mint 是否有类似的系统。可能不是,特别是对于 /usr
这是一个相当重要的问题。
选项 3:奇怪的东西
您使用的是不应该再使用的过时 java API。这个 API 的缺点之一是它不能给你关于东西的信息,它只能 return 布尔值。所以,尝试使用新的 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