Разбиение на страницы при получении файла - PullRequest
0 голосов
/ 06 мая 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.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;
            try (Stream<Path> walk = Files.walk(Paths.get("C://FileTest"))) {
                List<String> result = 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());
                result.forEach(System.out::println);
                System.out.println(result.size());
            } 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)

1 Ответ

0 голосов
/ 06 мая 2020

Вы можете использовать пропуск в своем потоке. Например:

int toSkip = 1000; // define as method param/etc.

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