【问题标题】:visiting first level of directory and get Size of each directory Java访问第一级目录并获取每个目录Java的大小
【发布时间】:2019-09-13 18:07:30
【问题描述】:

我需要 C: 中的目录列表并获取每个目录的大小。 我正在尝试使用此代码:

int[] count = {0};
try {
    Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
            Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
                    System.out.printf("Visiting file %s\n", file);
                    ++count[0];

                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException {
                    System.err.printf("Visiting failed for %s\n", file);

                    return FileVisitResult.SKIP_SUBTREE;
                }

                @Override
                public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException {
                     System.out.printf("About to visit directory %s\n", dir);
                    return FileVisitResult.CONTINUE;
                }
            });
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} 

我遇到的问题是,如果我完全使用它,会花费很多时间,因为它会访问每个文件!的磁盘。我尝试了 FileVisitResult 的不同选项,但我无法获得所需的结果。我只需要磁盘空间的第一级。 提前感谢您的帮助。

【问题讨论】:

  • 请注意,在文件访问期间记录日志可能会大大减慢操作速度,因为每条日志消息都有成本。您可以尝试记录每 1000 个文件,看看它是否更快
  • “访问每个文件需要很多时间” - 为了计算访问每个文件所需的内存消耗。如果您在仍会访问每个文件的 linux 系统上执行 du --max-depth=1 之类的操作 - 它只会报告一个级别的大小。但是,您的代码的主要问题很可能是 Fernando 所指出的:日志记录会大大降低速度。
  • 真的可以让它变得非常快吗?如果你想直接从 Windows 资源管理器检查目录的大小,如果有很多文件,也可能需要几秒钟。不了解linux系统。
  • 这也取决于您的磁盘。如果你有一个 5400RPM 的硬盘,与三星 evo 970 plus SSD 相比,差异将是巨大的 :)
  • 您想要文件中的数据大小还是磁盘上的大小? Windows 通常使用 4,096 字节块。此外,对于小文件,数据存储在 MFT 中。

标签: java java-8


【解决方案1】:

文件夹没有自己的(显着)大小。通常在讨论文件夹大小时,其含义是该文件夹及其子文件夹下所有文件的大小之和。对于 C:\,此操作需要“非常长”的时间(尝试右键单击您的 Program Files 文件夹并点击属性)。删除所有日志并重试。比较您的代码所花费的时间,以及 Windows 资源管理器计算该大小所花费的时间(同样,通过右键单击您的 Program Files 文件夹并点击属性)。

无论如何,Apache 的commons-io 有一个单行:

long size = FileUtils.sizeOfDirectory(folder);

Java-8 还有另一个“纯”单行:

long size = Files.walk(Paths.get("C:\\"))
      .filter(p -> p.toFile().isFile())
      .mapToLong(p -> p.toFile().length())
      .sum();

【讨论】:

  • Files.walk 如果文件夹内有程序没有权限的文件夹,则会失败。使用walkFileTree,您可以避免这种情况……尽管更多行。学得很辛苦:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2019-07-28
  • 2014-01-22
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多