Java - file.length()即使文件不可读也会返回

时间:2013-01-12 03:33:37

标签: java linux operating-system filesystems ubuntu-12.10

我有一个文件,我已经压制了每个权限。没有人应该能够阅读该文件,对吗?事实上,如果我跑

File f = new File("not_readable.pdf");
System.out.println(f.canRead())

我得到了

false

但是,如果我打电话

File f = new File("not_readable.pdf");
System.out.println(f.length())

我得到了

455074

我的理解是,为了获得文件的大小,必须首先打开并读取文件,但这个结果强烈暗示我错了。有谁知道为什么会这样?另外,有没有办法阻止Java的file.length()方法访问文件的大小?

我正在使用Ubuntu 12.10

2 个答案:

答案 0 :(得分:16)

你错了:文件的长度是文件系统元数据(至少对于在Linux VFS下运行的文件系统)。任何对目录具有读取权限的人都可以看到所有包含的文件及其大小。为了防止用户看到文件的大小,您必须阻止他们完全看到它,即如果用户不在与目录关联的组中,则将文件放在具有drwxr-x---权限的目录中,或{ {1}}如果用户在该组中。

答案 1 :(得分:2)

我不明白为什么你需要读取权限才能查看文件的大小。在Linux中,ls将显示目录中所有文件的内容(包括其大小),即使您对它们没有权限,只要您对包含该文件的目录具有适当的权限即可。文件大小是文件分配表的属性,而不是文件本身的属性,因此length()不需要检查实际文件本身(并且通过计算它来获取长度是非常低效的。文件中的字节数。)