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 явно говорит:
Элементы, возвращаемые итератором, не имеют определенного порядка. Некоторые файловые системы поддерживают специальные ссылки на сам каталог и родительский каталог каталога. Записи, представляющие эти ссылки, не возвращаются итератором.
Так что, если вам нужен конкретный заказ, вы должны отсортировать Path
s. Например, для сортировки по алфавиту вы можете сделать так:
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);
}