【问题标题】:How to get list of file in directory in batches?如何批量获取目录中的文件列表?
【发布时间】:2020-08-22 10:44:10
【问题描述】:

我有一个存储 3000 个文件的位置。但我想一次获取 1000 个文件的列表,然后再调用另外 1000 个文件,依此类推。

请找到我的以下代码:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class FileSystem {

    public static void main(String args[]) throws Exception {
        FileSystem.createListFile();
        FileSystem.getFileInBatch();
    }

    private static void getFileInBatch() {
        int MAX_INDEX = 1000;
        List<String> result = new ArrayList<>();

        try (Stream<Path> walk = Files.walk(Paths.get("C://FileTest"))) {

            List<String> batchResult = walk.filter(p -> Files.isRegularFile(p) && p.getFileName().toString().endsWith(".txt"))
                    .sorted(Comparator.comparingInt(FileSystem::pathToInt))
                    .map(x -> x.toString()).limit(MAX_INDEX).collect(Collectors.toList());

            batchResult.forEach(System.out::println);
            System.out.println(batchResult.size());
            result.addAll(batchResult);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    private static int pathToInt(final Path path) {
        return Integer.parseInt(path.getFileName()
                .toString()
                .replaceAll("Aamir(\\d+).txt", "$1")
        );
    }

    private static void createListFile() throws IOException {
        for (int i = 0; i < 3000; i++) {
            File file = new File("C://FileTest/Aamir" + i + ".txt");

            if (file.createNewFile()) {

                System.out.println(file.getName() + " is created!");
            }
        }
    }

}

我能够使用流中的限制获取前 1000 个(Aamir0.txt 到 Aamir999.txt)文件。

现在我怎样才能批量获取接下来的 1000 个文件(Aamir1000.txt 到 Aamir1999.txt),然后是接下来的 1000 个文件。我期待一些循环会连续批量提供 1000 个有序文件。

【问题讨论】:

  • 请看一下stackoverflow.com/questions/30641383/…这可能会有所帮助
  • 会一直是 3000 个文件吗?
  • 不,这将是大量文件。我试图先做 3000 个文件,所以我们可以做同样的事情
  • @AAMIRAZAM 好的。另外,你到底在列表中添加了什么?所有文件的路径?我很难理解你的代码。
  • @Schred:有一个位置存储了大量文件,比如说 4000 个文件。现在我想一次取出 1000 个文件并进行一些操作,然后选择接下来的 1000 个文件并进行一些操作,然后再选择接下来的 1000 个文件并进行操作。这将一直持续到我不会访问该位置的所有文件为止。

标签: java java-8 filesystems


【解决方案1】:

我不确定你想对每个文件做什么,但这个逻辑应该适合你:

private static final int MAX_VALUE = 5;

public static void main(String[] args) {
    try (Stream<Path> walk = Files.walk(Paths.get("path/to/your/directory"))) {

        List<String> list = new ArrayList<>(MAX_VALUE);
        walk.filter(path -> path.getFileName().toString().endsWith("txt"))
            .sorted((a, b) -> compare(a, b)
            .forEach(path -> handlePath(path, list));

    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static void handlePath(Path path, List<String> list) {
    list.add(path.toString());

    if (list.size() >= MAX_VALUE) {
        // Do something

        list.clear();
    }
}

public static int compare(Path a, Path b) {
    String aStr = a.getFileName().toString(), bStr = b.getFileName().toString();

    int valA = Integer.parseInt(aStr.replaceAll("[^0-9.]|\\.", ""));
    int valB = Integer.parseInt(bStr.replaceAll("[^0-9.]|\\.", ""));

    return valA - valB;
}

【讨论】:

  • 很好,但在这种情况下,我应该知道文件名,但假设我们不知道文件名。那么它有效吗?
  • 假设有 abc.txt、bred.txt、hfc.txt 等不同名称的文件。然后它起作用了
  • @AAMIRAZAM 啊,好的。没想到这是一个要求。不过,您确实有目录,不是吗?
  • 是的,我有一个目录:C://filetest,但是它将如何排序并从目录中批量选择 1000 个文件
  • @AAMIRAZAM 好的,我已经完全编辑了我的答案。这应该有效。虽然我使用的是 Java 12,但我不知道您是否可以使用所有这些功能。如果没有,我会做一些小的调整。
【解决方案2】:

您正在使用流,它们有很好的 API 来满足您的需求。

你正在限制阅读数据

.limit(MAX_INDEX)

要获得其他结果,一种方法是结合使用跳过和限制方法:

.skip(MAX_INDEX).limit(MAX_INDEX)

这样您就可以根据您的 MAX_INDEX 值访问后 1000 个字符。

【讨论】:

  • 这不是最优的,因为它必须重新遍历所有前 1000 个项目
  • 是的。另外,我必须再次为接下来的 1000 个元素编写相同的代码,并且会重复。任何人都有任何想法,我们该怎么做。
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多