/我的Java程序无法识别usr/本地文件夹和子文件夹
我有一个64位LinuxMint20.1操作系统,我意识到我的任意Java程序不能将“/usr/local”或其中的任何内容识别为现有实体。为了澄清我的意思,我在下面列举了几个例子:/我的Java程序无法识别usr/本地文件夹和子文件夹,java,linux,permissions,linux-mint,Java,Linux,Permissions,Linux Mint,我有一个64位LinuxMint20.1操作系统,我意识到我的任意Java程序不能将“/usr/local”或其中的任何内容识别为现有实体。为了澄清我的意思,我在下面列举了几个例子: System.out.println(new File("/usr").exists()); //prints true System.out.println(new File("/usr/local").exists()); //prints false System.
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个字母适用(用户/组/其他)。因此,运行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中,您需要转到系统首选项窗格并转到“隐私”,然后在此处添加一些磁盘访问权限。我不确定mint是否有类似的系统。可能不会,尤其是对于/usr
,这是一个相当重要的问题
选项3:奇怪的东西
您使用的是过时的java API,不应该再使用了。这个API的一个缺点是它不能给你关于东西的信息,它只能返回布尔值。因此,尝试使用新的API,如果出现错误,因为如果出现错误,它将帮助更多:它将有大量文本向您解释:
(首先检查/usr/bin/man是否存在;它应该存在。如果不存在,请选择您在那里找到的任何其他现有对象)
这将抛出一些东西(或者如果没有抛出,嘿,其他一些东西出了问题,因为这个测试应用程序没有问题!)-该异常的文本将告诉您一些有用的信息
选项4:哦
您的磁盘已损坏。希望不是这样吧:P
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);
}
}