【问题标题】:Java NIO Read Folder's content's attributes at onceJava NIO 一次读取文件夹内容的属性
【发布时间】:2021-06-16 14:50:22
【问题描述】:

我正在使用 Java 和 NIO 包编写备份程序。

据我发现,我可以按照下面的代码示例执行此操作,即读取文件夹内容列表,然后对于每个文件我必须执行文件属性请求...这不是一种有效的方法,尤其是如果有人在一个文件夹中有数千个文件的大文件夹,所以也许有另一种方法可以通过读取文件夹的所有属性来做到这一点?

或者我应该在这种情况下使用其他东西而不是 NIO 吗?非常感谢

public void scan(Path folder) throws IOException {
    try (DirectoryStream<Path> ds = Files.newDirectoryStream(folder)) {
        for (Path path : ds) {
            //Map<String, Object> attributes = Files.readAttributes(path, "size,lastModifiedTime");
        }
    }
}

【问题讨论】:

  • 没有别的办法。甚至操作系统级别的 API 也无法替代这种方法。能够“读取文件夹内容及其所有属性”的方法的返回类型是什么?
  • 这是一个问题,它如何在较低级别上工作......例如,在 Windows 和 Linux 中,如果我键入“dir”或“ls -la” - 那么我将得到所有需要的信息...所以我想也许当Java读取文件夹的内容时,在较低级别上它也会读取属性然后省略它...您能确认或反驳吗?
  • 这些命令在内部执行相同的操作:它们逐个检索每个文件的属性。 The source of ls 表明它使用了 readdir(3),它一次返回一个条目的属性。
  • 这可能有助于回答您的问题,使用 Files.find 并且您可以使用谓词中的属性以及流内部的属性,而无需自己调用 Files.readAttributes。 How to get Streams of File Attributes from the FileSystem?
  • @DuncG 非常感谢您,通过简要查看似乎您的链接正是我所需要的,但我需要先对其进行测试......所以我希望它对我有用:)我将在几 GB 的不同废品文件上添加我的基准测试结果...

标签: java nio file-attributes directorystream


【解决方案1】:

感谢DuncG,答案很简单:

HashMap <Path, BasicFileAttributes> attrs = new HashMap<>();
BiPredicate<Path, BasicFileAttributes> predicate = (p, a) -> {
    return attrs.put(p, a) == null;
};
Stream<Path> stream = Files.find(folder, Integer.MAX_VALUE, predicate);

我做了一个基准来比较,这个例子的执行速度比问题文本中的例子快 3 倍,所以它似乎调用了更少的文件系统 I/O 操作......理论上......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 2018-12-25
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2021-07-09
    相关资源
    最近更新 更多