Лучший способ перечислить файлы в Java, отсортированные по дате изменения? - PullRequest
224 голосов
/ 15 октября 2008

Я хочу получить список файлов в каталоге, но я хочу отсортировать его так, чтобы самые старые файлы были первыми. Мое решение состояло в том, чтобы вызвать File.listFiles и просто использовать список, основанный на File.lastModified, но мне было интересно, есть ли лучший способ.

Edit: мое текущее решение, как предлагается, заключается в использовании анонимного компаратора:

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());
    } });

Ответы [ 16 ]

1 голос
/ 02 августа 2016
private static List<File> sortByLastModified(String dirPath) {
    List<File> files = listFilesRec(dirPath);
    Collections.sort(files, new Comparator<File>() {
        public int compare(File o1, File o2) {
            return Long.compare(o1.lastModified(), o2.lastModified());
        }
    });
    return files;
}
1 голос
/ 11 июня 2014

Вы можете использовать Apache LastModifiedFileComparator библиотека

 import org.apache.commons.io.comparator.LastModifiedFileComparator;  


File[] files = directory.listFiles();
        Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
        for (File file : files) {
            Date lastMod = new Date(file.lastModified());
            System.out.println("File: " + file.getName() + ", Date: " + lastMod + "");
        }
1 голос
/ 17 марта 2013

Вы можете попробовать гуаву Заказ :

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);
0 голосов
/ 30 июля 2018

Существует очень простой и удобный способ решения проблемы без дополнительного компаратора. Просто закодируйте измененную дату в строку с именем файла, отсортируйте ее, а затем снова удалите.

Используйте строку фиксированной длины 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());

Что здесь происходит:

Имя файла1: C: \ data \ file1.html Последнее изменение: 1532914451455 Последнее изменение 20 цифр: 00000001532914451455

Имя файла1: C: \ data \ file2.html Последнее изменение: 1532918086822 Последнее изменение 20 цифр: 00000001532918086822

преобразует имена файлов в:

Имя файла1: 00000001532914451455C: \ data \ file1.html

Имя файла2: 00000001532918086822C: \ data \ file2.html

Затем вы можете просто отсортировать этот список.

Все, что вам нужно сделать, это снова обрезать 20 символов позже (в Java 8 вы можете обрезать его для всего массива всего одной строкой, используя функцию .replaceAll)

0 голосов
/ 28 июля 2018

Существует также совершенно другой способ, который может быть даже проще, поскольку мы не имеем дело с большими числами.

Вместо сортировки всего массива после того, как вы получили все имена файлов и даты lastModified, вы можете просто вставить каждое отдельное имя файла сразу после того, как вы получили его в правильной позиции списка.

Вы можете сделать это так:

list.add(1, object1)
list.add(2, object3)
list.add(2, object2)

После добавления объекта 2 в положение 2 он переместит объект 3 в положение 3.

0 голосов
/ 27 ноября 2015

Я пришел к этому сообщению, когда искал ту же проблему, но в 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
    }

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...