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

当前回答

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

其他回答

使用Java 8+ 这里文件按修改日期降序排序(更新的文件第一次打印)

public void deleteOldFiles(String directory) {
    try {
        File file = new File(directory);
        Arrays.stream(file.listFiles()).filter(File::isFile)
                .sorted((file1, file2) -> {
                    if(file1.lastModified()>file2.lastModified()){
                        return -1;
                    }else if(file1.lastModified()<file2.lastModified()){
                        return 1;
                    }else {
                        return 0;
                    }
                }).forEach(System.out::println);

    } catch (Exception e) {
        System.out.println("No such directory exists: " + directory);
    }
}

如果您有很多文件,这可能会更快。这使用装饰-排序-不装饰模式,以便每个文件的最后修改日期只获取一次,而不是每次排序算法比较两个文件时都获取。这可能会将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;

你也可以看看apache commons IO,它有一个内置的最后修改比较器和许多其他很好的工具来处理文件。

你可以试试番石榴。

Function<File, Long> getLastModified = new Function<File, Long>() {
    public Long apply(File file) {
        return file.lastModified();
    }
};

List<File> orderedFiles = Ordering.natural().onResultOf(getLastModified).
                          sortedCopy(files);

在Java 8中:

数组。sort(files, (a, b) -> Long.compare(a. lastmodified (), b. lastmodified ()));