我想获得目录中的文件列表,但我想对其进行排序,以便最早的文件排在前面。我的解决方案是调用File。listFiles,然后根据File返回列表。lastModified,但我想知道是否有更好的方法。
编辑:我目前的解决方案,建议是使用匿名比较器:
File[] files = directory.listFiles();
Arrays.sort(files, new Comparator<File>(){
public int compare(File f1, File f2)
{
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
} });
有一种非常简单方便的方法来处理这个问题,不需要任何额外的比较器。只需将修改后的日期编码到具有文件名的字符串中,对其排序,然后再次将其剥离。
使用固定长度为20的字符串,将修改后的日期(长)放入其中,并以前导零填充。然后将文件名附加到这个字符串:
String modified_20_digits = ("00000000000000000000".concat(Long.toString(temp.lastModified()))).substring(Long.toString(temp.lastModified()).length());
result_filenames.add(modified_20_digits+temp.getAbsoluteFile().toString());
事情是这样的:
Filename1: C:\data\file1.html最近修改:1532914451455最近修改20数字:00000001532914451455
Filename1: C:\data\file2.html最近修改:1532918086822最近修改20数字:00000001532918086822
将文件名转换为:
Filename1: 00000001532914451455 c: \ \ file1.html数据
Filename2: 00000001532918086822 c: \ \ file2.html数据
然后你可以对这个列表进行排序。
你所需要做的就是稍后再次剥离这20个字符(在Java 8中,你可以使用.replaceAll函数用一行来剥离整个数组)
这是@jason-orendorf回答的一个稍微现代化的版本。
注意:这个实现保持原始数组不变,并返回一个新数组。这可能是可取的,也可能不是。
files = Arrays.stream(files)
.map(FileWithLastModified::ofFile)
.sorted(comparingLong(FileWithLastModified::lastModified))
.map(FileWithLastModified::file)
.toArray(File[]::new);
private static class FileWithLastModified {
private final File file;
private final long lastModified;
private FileWithLastModified(File file, long lastModified) {
this.file = file;
this.lastModified = lastModified;
}
public static FileWithLastModified ofFile(File file) {
return new FileWithLastModified(file, file.lastModified());
}
public File file() {
return file;
}
public long lastModified() {
return lastModified;
}
}
但是还是要感谢@jason-orendorf的想法!