Как получить список файлов в каталоге партиями? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть место, где хранится 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 упорядоченных файлов партиями.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Я не уверен, что вы хотите делать с каждым файлом, но этот logi c должен работать для вас:

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;
}
0 голосов
/ 07 мая 2020

Вы используете потоки, и у них есть прекрасные API для выполнения вашего желания.

вы ограничиваете данные чтения с помощью

.limit(MAX_INDEX)

для получения других результатов, одним из способов является использование комбинации методы пропуска и ограничения:

.skip(MAX_INDEX).limit(MAX_INDEX)

таким образом вы можете получить доступ ко вторым 1000 символам на основе вашего значения MAX_INDEX.

...