为什么java中File.length()的大小与linux du命令的大小不同

时间:2016-01-29 20:47:10

标签: java

1>对于一个空目录,linux命令du将显示0大小,这意味着它不使用磁盘空间。对? 但java中的File.length()不会显示为零,而是显示空目录使用了一些字节。

如果确实Unix中的所有内容都是文件而且占用磁盘空间,那么Java就在这里,为什么du显示其0块。

如果它应该是0个块,那么为什么Java显示空目录使用的一些字节?

$ mkdir empty_directory
$ du -h empty_directory/
  0B    empty_directory/
$ du  empty_directory
  0     empty_directory


File f = new File("/test/empty_directory");
if (f.exists() && f.isDirectory()) {
    System.out.println(f.length());
}

68

2 - ;对于同样没有空文件,linux命令du显示的大小仍然与java中的File.length()大小不同。
原因只来自差异单位:du使用的块和File.length()使用的字节?

$ du -h oneline.txt 
4.0K    oneline.txt
$ du   oneline.txt 
8    oneline.txt
$ ls -s oneline.txt
8    oneline.txt

-s显示每个文件实际使用的文件系统块数,以512字节为单位,其中部分单位向上舍入为下一个整数值。如果输出到终端,则在列出之前的行上输出所有文件大小的总和。环境变量BLOCKSIZE会覆盖512字节的单位大小。

File f = new File("/test/oneline.txt");
if (f.exists() && f.isFile()) {
    System.out.println(f.length());
}

26

困惑。请你帮个忙吗?

4 个答案:

答案 0 :(得分:8)

因为du命令具有不同的用途,因为其 man 页面显示。它显示文件使用的磁盘空间大小,包括部分空块。这与文件的大小不同,后者是它包含的数据量。

答案 1 :(得分:4)

在Linux / Unix系统上,有一个"块大小"的概念。此块大小是操作系统可以处理文件的最小空间量。 du报告块大小,而不是确切的文件大小。这是文件在操作系统上占用的空间,而不是文件的大小。

  

du实用程序显示文件系统块使用情况...

为了澄清,让我们说我的块大小= 4 KB(这是相当普遍的。)如果我创建一个2 KB的文本文件,那么文件的大小是2 KB,但是文件在系统上占用的空间为4 KB,因为这是操作系统可以分发的最小数量。

同样,如果我创建了一个11 KB的文件,那么文件大小为11 KB,但实际上需要12 KB。这是因为我们需要3个块才能保存文件。

:编辑:stat -f将以字节为单位显示驱动器上的块大小。例如,

stat -f /dev/sda1
...
File: "/dev/sda1"
Block size: 4096
...

然后,您可以将其与ls -ls配对,以提供包含文件使用的块数的目录列表。这些块是最左边的列。

ls -ls
1 -rw-r--r--. 1 brasmussen someGroup        0 Jan 29 16:24 f1

你可以在这里看到即使是文件" f1"大小为0字节,它仍占用一个块。因此,其OS大小为4KB,文件大小为0KB。

答案 2 :(得分:1)

Directories are just special cases of files并且两者都是inode的特化,即使它们不包含任何内容,它们也会占用磁盘空间。磁盘上必须有一些东西来表示目录的存在,它的权限和其他簿记。所以目录是用尽磁盘但没有长度的文件,因为它们什么都没有。

您正在将苹果和橙子与预期不会返回相同结果的程序进行比较,因为它们会计算并报告不同的内容。

答案 3 :(得分:0)

块大小是Linux和Windows共有的功能。它是由文件系统的工作方式引起的,而不是特定于Java的。由于处理空间的方式,块可以被不超过一个文件占用。

创建一个新的文本document.txt,在其中写入一个字符并检查文件大小。它将显示1字节的大小和磁盘4 Kb的大小。