我正在尝试使用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());
}
答案 0 :(得分:3)
班级DirectoryStream的javadoc 明确地说:
迭代器返回的元素是,没有特定的顺序。 某些文件系统保持与目录本身的特殊链接 和目录的父目录。表示这些链接的条目 迭代器不会返回。
因此,如果您需要特定订单,则需要对Path
进行排序。
例如,对于按字母顺序排序,您可以这样做:
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);
}