我想获得目录中的文件列表,但我想对其进行排序,以便最早的文件排在前面。我的解决方案是调用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());
    } });

当前回答

如果您有很多文件,这可能会更快。这使用装饰-排序-不装饰模式,以便每个文件的最后修改日期只获取一次,而不是每次排序算法比较两个文件时都获取。这可能会将I/O调用的数量从O(n log n)减少到O(n)。

不过,它的代码更多,所以只有当您主要关注速度时才应该使用这种方法,而且在实践中它确实更快(我没有检查过)。

class Pair implements Comparable {
    public long t;
    public File f;

    public Pair(File file) {
        f = file;
        t = file.lastModified();
    }

    public int compareTo(Object o) {
        long u = ((Pair) o).t;
        return t < u ? -1 : t == u ? 0 : 1;
    }
};

// Obtain the array of (file, timestamp) pairs.
File[] files = directory.listFiles();
Pair[] pairs = new Pair[files.length];
for (int i = 0; i < files.length; i++)
    pairs[i] = new Pair(files[i]);

// Sort them by timestamp.
Arrays.sort(pairs);

// Take the sorted pairs and extract only the file part, discarding the timestamp.
for (int i = 0; i < files.length; i++)
    files[i] = pairs[i].f;

其他回答

当我在搜索同样的问题时,我来到了这个帖子,但在android上。 我并不是说这是按最后修改日期排序文件的最佳方法,但它是我迄今为止发现的最简单的方法。

下面的代码可能对某人有帮助-

File downloadDir = new File("mypath");    
File[] list = downloadDir.listFiles();
    for (int i = list.length-1; i >=0 ; i--) {
        //use list.getName to get the name of the file
    }

谢谢

有一种非常简单方便的方法来处理这个问题,不需要任何额外的比较器。只需将修改后的日期编码到具有文件名的字符串中,对其排序,然后再次将其剥离。

使用固定长度为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函数用一行来剥离整个数组)

我认为你的解决办法是唯一明智的办法。获取文件列表的唯一方法是使用File.listFiles(),文档声明这不能保证返回的文件的顺序。因此,您需要编写一个使用File.lastModified()的比较器,并将其与文件数组一起传递给Arrays.sort()。

自Java 8以来的优雅解决方案:

File[] files = directory.listFiles();
Arrays.sort(files, Comparator.comparingLong(File::lastModified));

或者,如果你想让它降序排列,就把它倒过来:

File[] files = directory.listFiles();
Arrays.sort(files, Comparator.comparingLong(File::lastModified).reversed());
Collections.sort(listFiles, new Comparator<File>() {
        public int compare(File f1, File f2) {
            return Long.compare(f1.lastModified(), f2.lastModified());
        }
    });

其中listFiles是数组列表中所有文件的集合