如何批量获取目录下的文件列表?

How to get list of file in directory in batches?

我有一个存储 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", "")
        );
    }

    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 个有序文件。

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

您正在使用

限制读取数据
.limit(MAX_INDEX)

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

.skip(MAX_INDEX).limit(MAX_INDEX)

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

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

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;
}