Nio перечисляет только часть каталога - PullRequest
0 голосов
/ 27 июня 2018

Поскольку File.list () отображает только все файлы в каталоге, я попытался использовать библиотеку nio Files.walkFileTree , Files.walk и Files.find , которые занимают больше времени, но более эффективны (например, перечисляют файлы в подкаталоге).

Я не могу найти, как перечислить только часть файлов в каталоге. Например, у меня более 10 тыс. Файлов, и перечисление их всех по одному может вызвать проблемы с памятью, поэтому я хотел бы работать только с 500 файлами и делать это снова, пока все не будет прочитано.

То, что я сейчас делаю, это:

List<String> result= new ArrayList<String>();
// try/catch
Stream<Path> stream = Files.find(path, maxDepth, (p, f) -> f.isRegularFile()) {
     result= stream.filter(Files::isRegularFile).map(s -> s.toString()).collect(Collectors.toList());

То же самое с File.walk()

И

Files.walkFileTree(start, options, maxDepth, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs) throws IOException {
        String fileName = filePath.getFileName().toString();
        result.add(fileName);
        return FileVisitResult.CONTINUE;
    }
});

Я не могу найти варианты, которые бы сделали это, или способ не читать только часть всех файлов в каталоге. Первым параметром для этих функций является папка, с которой начинается чтение, а не файл, с которого начинается.

1 Ответ

0 голосов
/ 06 июля 2018

Вся оптимизация / лень Files.find теряется, если вы с нетерпением собираете его результат, т.е. е. звоните собирать в потоке. Наиболее эффективный способ памяти:

public static void list(Path path, int maxDepth, Consumer<Path> listFile) throws IOException {
    java.nio.file.Files.find(path, maxDepth, (p, f) -> f.isRegularFile()).forEach(listFile);
}

public static void exampleUse() throws IOException {
    list(Paths.get("."), 10, System.out::println);
}
...