2016-01-29 280 views
1

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

如果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 

困惑。你能否就此提供一些帮助?

+0

您使用的是哪个版本的java?来自javadoc的 – STaefi

+3

返回由此抽象路径名表示的文件的长度。如果此路径名表示目录,则返回值未指定。“# –

+0

对于第一个问题,javadoc说:*如果此路径名表示目录*,则返回值未指定。 –

回答

4

在Linux/Unix系统上,有一个“块大小”的概念。该块大小是操作系统可以处理文件的最小空间量。 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。

+0

非常感谢您的详细反馈。我现在清楚第二个问题。对于第一个问题,因为Unix中的每一件事情都是文件,我认为一个空目录也应该占用磁盘空间,但是du命令会显示一个空目录的块使用数量是0 –

+0

加上一点上下文:4k是通常用作块大小,因为在传统的硬盘驱动器中(你知道,那些具有旋转磁盘盘片和读取磁头的磁盘以及其他东西),4K是一个扇区的大小。扇区是硬盘驱动器一次可读取旋转磁盘的最小数据单位。 – nasukkin

8

因为du命令有不同的目的,因为它的页面显示。它显示文件使用多少磁盘空间,包括部分空白的块。这与文件的大小不同,它包含多少数据。

+0

磁盘空间==使用的磁盘块数量。因为空间分配在磁盘块中......而不是字节。 –

+0

“包含部分空白块”的部分内容你不明白吗? – EJP

+0

谢谢@Stephen C和EJP!现在用BRasmussen的回答得到它。但我还不清楚的是第一个问题,空目录也是Unix中的一个文件,它也应占用磁盘空间,而du显示它需要0个块 –

1

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

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

+0

谢谢你的帮助。由于空目录占用磁盘空间,使我困惑的是du命令会显示空目录的使用数量为0 –

0

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

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

相关问题