You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

java.io.File.listFiles(FilenameFilter)是否返回已排序的文件对象?

关于java.io.File.listFiles(FilenameFilter filter)返回顺序的问题

首先直接给结论:java.io.File.listFiles(FilenameFilter filter)方法不会保证返回的文件对象/文件名是经过排序的

这个方法的返回顺序完全依赖于底层操作系统的文件系统实现——不同的操作系统(比如Windows、Linux、macOS)返回的文件顺序可能截然不同,甚至同一系统下,文件系统的类型(比如NTFS vs FAT32)也会影响返回顺序。你当前看到的有序可能只是某个特定环境下的巧合,换个环境或者文件数量变化后,顺序很可能就乱了。

看你的代码,你通过FIUtil.getFilesList()获取文件数组后直接遍历输出,如果这个工具方法内部是基于listFiles(FilenameFilter)实现的,那同样不能依赖它的默认顺序。如果你的业务逻辑需要固定的文件顺序(比如按文件名、修改时间排序),一定要手动对结果数组进行排序。

举个简单的例子,如果你想按文件名的字典序排序,可以在遍历前加上这段代码:

import java.util.Arrays;

// 对文件名数组按字典序排序
Arrays.sort(files);

如果需要按文件的修改时间排序(从旧到新),可以用自定义比较器:

import java.io.File;
import java.util.Arrays;

// 按文件最后修改时间排序
Arrays.sort(files, (fileNameA, fileNameB) -> {
    File fileA = new File(FIConstants.getIFDirectory(filePrefix), fileNameA);
    File fileB = new File(FIConstants.getIFDirectory(filePrefix), fileNameB);
    return Long.compare(fileA.lastModified(), fileB.lastModified());
});

总结一下:永远不要依赖listFiles系列方法的默认返回顺序,显式排序才是保证业务一致性的可靠方式。

内容的提问来源于stack exchange,提问作者Connie Varley

火山引擎 最新活动