【问题标题】:Java - file.length() returns even if the file is not readableJava - 即使文件不可读,file.length() 也会返回
【发布时间】:2012-12-26 17:33:09
【问题描述】:

我有一个文件,我从该文件中禁止了所有权限。应该没有人能够读取文件,对吧?事实上,如果我运行

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

【问题讨论】:

  • ext* 文件系统是否保存大小?试试这个:cat /dev/urandom > file; chmod 000 file; ls -sh file;我可能错了,但我很确定ls即使权限为零也可以读取文件大小。
  • 为什么必须打开文件才能得到长度?这将存储在文件系统的目录信息中。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 2016-11-03
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多