DirectoryStream возвращает путь в каком порядке? имя файла, последнее изменение, размер файла?

Я пытаюсь прочитать несколько файлов в папке, используя DirectoryStream. Всего 10 предметов.

doc_01.txt, doc_02.txt, doc_03.txt, doc_04.txt, doc_05.txt, doc_06.txt, doc_07.txt, doc_08.txt, doc_09.txt, doc_10.txt

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

./mydata/doc_01.txt,./mydata/doc_02.txt,./mydata/doc_03.txt,./mydata/doc_04.txt,./mydata/doc_08.txt,./mydata/doc_07.txt,./ mydata / doc_09.txt,./mydata/doc_10.txt,./mydata/doc_05.txt,./mydata/doc_06.txt

Это мой код:

public static void readData(){
    Instant start = Instant.now();
    System.out.println("Start reading");

    Path path = Paths.get(String.join(File.separator, ".", "mydata"));

    try(DirectoryStream<Path> stream = 
            Files.newDirectoryStream(path, "*.txt")
    ){
        for(Path entry : stream){
            System.out.println("reading: " +entry.toString());
        }
    }catch(IOException e){
        System.err.println("Error: " + e.getMessage());
        e.printStackTrace();
    }
    Instant end = Instant.now();
    System.out.println("Done in " + Duration.between(start, end).toString());
}

1 ответ

Решение

Javadoc класса DirectoryStream явно говорит:

Элементы, возвращаемые итератором, не имеют определенного порядка. Некоторые файловые системы поддерживают специальные ссылки на сам каталог и родительский каталог каталога. Записи, представляющие эти ссылки, не возвращаются итератором.

Так что, если вам нужен конкретный заказ, вы должны отсортировать Paths. Например, для сортировки по алфавиту вы можете сделать так:

DirectoryStream<Path> stream = ...;
List<Path> list = new ArrayList<>();
stream.forEach(list::add);
list.sort(Comparator.comparing(Path::toString));
for (Path entry: list) {
  System.out.println("reading: " +entry);
}
Другие вопросы по тегам