【问题标题】:why the size of File.length() in java is not same with that of linux du command为什么 java 中 File.length() 的大小与 linux du 命令的大小不一样
【发布时间】:2016-01-29 20:47:09
【问题描述】:

1> 对于一个空目录,linux命令du会显示0 size,这意味着它不使用磁盘空间。正确的? 但是 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

困惑。你能提供一些帮助吗?

【问题讨论】:

  • 你用的是哪个版本的java?
  • 来自 javadoc Returns the length of the file denoted by this abstract pathname. The return value is unspecified if this pathname denotes a directory.
  • 对于您的第一个问题,javadoc 说:如果此路径名表示目录,则返回值未指定
  • 在发布这个问题之前,我已经看到了 javadoc。我只是不清楚“未指定值”的含义。

标签: java


【解决方案1】:

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

【讨论】:

  • 磁盘空间 == 使用的磁盘块数。因为空间是在磁盘块中分配的......而不是字节。
  • “包括部分空块”的哪一部分你不明白?
  • 感谢@Stephen C 和 EJP!现在得到了布拉斯穆森的回答。但是我还不清楚第一个问题,空目录在Unix中也是一个文件,它也应该占用磁盘空间,而du show它占用0块
【解决方案2】:

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

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

为了澄清,假设我的块大小 = 4 KB(这很常见)。如果我创建一个 2 KB 的文本文件,那么文件的大小是 2 KB,但文件占用的空间量系统上最多为 4 KB,因为这是操作系统可以分配的最小数量。

同样,如果我制作了一个 11 KB 的文件,那么文件大小是 11 KB,但它实际上占用了 12 KB。这是因为我们需要 3 个块来保存文件。

:Edit: 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。

【讨论】:

  • 非常感谢您的详细反馈。我现在很清楚第二个问题。对于第一个问题,由于Unix中的一切都是文件,我认为空目录也应该占用磁盘空间,但是du命令会显示空目录使用的块数为0
  • 加上一点上下文:4k 通常用作块大小,因为在传统的硬盘驱动器(你知道,那些带有旋转磁盘盘片和四处移动的读取头的硬盘驱动器)中,4k是一个扇区的大小。扇区是硬盘驱动器一次可以从旋转磁盘读取的最小数据单位。
【解决方案3】:

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

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

【讨论】:

  • 感谢您的帮助。由于空目录占用磁盘空间,让我困惑的是du命令会显示空目录的块使用量为0
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多