3

我正在尝试使用 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());
}
4

1 回答 1

8

DirectoryStream类的 javadoc 明确表示:

迭代器返回的元素没有特定的顺序。一些文件系统维护到目录本身和目录的父目录的特殊链接。迭代器不返回代表这些链接的条目。

因此,如果您需要特定的顺序,则由您对Paths 进行排序。例如,对于字母排序,您可以这样做:

DirectoryStream<Path> directoryStream = ...;
StreamSupport.stream(directoryStream.spliterator(), false)
    .sorted(Comparator.comparing(Path::toString))
    .forEach(p -> { System.out.println("reading: " + p); });
于 2017-04-30T13:12:36.030 回答