【问题标题】:Why used space calculated, for a directory, using java and 'du -sk' are different ?, and what is the exact java alternative for 'du -sk'?为什么使用 java 和 'du -sk' 为目录计算的已用空间不同?'du -sk' 的确切 java 替代方案是什么?
【发布时间】:2016-08-09 09:39:08
【问题描述】:

为什么使用 java 和 'du -sk' 为目录计算的已用空间不同?还有 'du -sk' 的确切 java 替代方案是什么?

PFB Java 代码,


    final String location = "/home/bhlabhla";
    final Path path = Paths.get(location);

    final Process process = Runtime.getRuntime().exec("du -sk " + location);
    final BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    System.out.println("used space [du -sk]");
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }

    System.out.println("***************************");
    // 1
    System.out.println("used space [Recursion]:" + getFolderSize(new File(location)) / 1024);
    // 2
    final long size = Files.walk(path).mapToLong(p -> p.toFile().length()).sum();
    System.out.println("used space [Java 8]:" + size / 1024);



public static long getFolderSize(final File dir) {
    long size = 0;
    for (final File file : dir.listFiles()) {
        if (file.isFile()) {
            size += file.length();
        } else {
            size += getFolderSize(file);
        }
    }
    return size;
}

输出,

已用空间 [du -sk]

83164000 /home/bhlabhla


已用空间[递归]:83151664

已用空间 [Java 8]:83153560

【问题讨论】:

  • 第一个问题的答案是文件系统开销,有几种不同的方式,最大的通常是集群大小。一个 789 字节的文件并不完全使用 789 字节的存储空间。它使用一些最小存储单元的倍数,通常是 4k 甚至 16k。不过,我不知道问题的答案。
  • 感谢您的回复。如果是这样的话,是否有可能通过 java api 获得文件系统开销。
  • 没有这样的Java API。

标签: java file-io nio du disk-access


【解决方案1】:

不同之处在于du 将始终打印真实的磁盘使用情况,而其中存储的信息可能更大或更小。

稀疏文件(您可以查找它们)可能会在少量磁盘存储中存储一个明显很大的文件。

硬链接(您可以查找它们)可能会存储多个文件来代替其中一个。

块大小(您可以查看它们)可能会在每个文件的末尾浪费一些字节,因此文件需要比它们包含的更多的存储空间。

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多