我想获得目录中的文件列表,但我想对其进行排序,以便最早的文件排在前面。我的解决方案是调用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());
} });
进口:
org.apache.commons.io.comparator.LastModifiedFileComparator
Apache Commons
代码:
public static void main(String[] args) throws IOException {
File directory = new File(".");
// get just files, not directories
File[] files = directory.listFiles((FileFilter) FileFileFilter.FILE);
System.out.println("Default order");
displayFiles(files);
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
System.out.println("\nLast Modified Ascending Order (LASTMODIFIED_COMPARATOR)");
displayFiles(files);
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
System.out.println("\nLast Modified Descending Order (LASTMODIFIED_REVERSE)");
displayFiles(files);
}
这是@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的想法!
有一种非常简单方便的方法来处理这个问题,不需要任何额外的比较器。只需将修改后的日期编码到具有文件名的字符串中,对其排序,然后再次将其剥离。
使用固定长度为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函数用一行来剥离整个数组)
进口:
org.apache.commons.io.comparator.LastModifiedFileComparator
Apache Commons
代码:
public static void main(String[] args) throws IOException {
File directory = new File(".");
// get just files, not directories
File[] files = directory.listFiles((FileFilter) FileFileFilter.FILE);
System.out.println("Default order");
displayFiles(files);
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
System.out.println("\nLast Modified Ascending Order (LASTMODIFIED_COMPARATOR)");
displayFiles(files);
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
System.out.println("\nLast Modified Descending Order (LASTMODIFIED_REVERSE)");
displayFiles(files);
}
还有一种完全不同的方法可能更简单,因为我们不处理大数。
在检索到所有文件名和lastModified日期之后,不必对整个数组进行排序,只需在检索到每个文件名之后在列表的正确位置插入它。
你可以这样做:
list.add(1, object1)
list.add(2, object3)
list.add(2, object2)
将object2添加到位置2后,它将把object3移动到位置3。