Как я могу отсортировать файлы в каталоге в Java? - PullRequest
3 голосов
/ 12 ноября 2011

Вот мой код, и он работает! Но я хочу иметь возможность сортировать список файлов по имени, размеру, дате изменения и т. Д.

import java.io.File;
import org.apache.commons.io.FileUtils;

public class StartingPoint {
    public static void main(String[] args) {
        File file = new File(
                "/home/t/lectures");
        File[] files = file.listFiles();
        for (File f : files) {
            System.out.println("File : " + f.getName() + " ["
                    + FileUtils.byteCountToDisplaySize(f.length()) + "]");
        }
    }
}

Ответы [ 2 ]

12 голосов
/ 12 ноября 2011
Arrays.sort( files, new Comparator<File>() {
    public int compare( File a, File b ) {
        // do your comparison here returning -1 if a is before b, 0 if same, 1 if a is after b
    }
} );

Вы можете определить кучу разных Comparator классов для различных сравнений, например:

public class FileNameComparator implements Comparator<File> {
    public int compare( File a, File b ) {
        return a.getName().compareTo( b.getName() );
    }
}

public class FileSizeComparator implements Comparator<File> {
    public int compare( File a, File b ) {
        int aSize = a.getSize();
        int bSize = b.getSize();
        if ( aSize == bSize ) {
            return 0;
        }
        else {
            return Integer.compare(aSize, bSize);
        }
    }
}

...

Тогда вы просто поменяете их местами:

Arrays.sort( files, new FileNameComparator() );

или

Arrays.sort( files, new FileSizeComparator() );
4 голосов
/ 17 июня 2015

Пример в Java8 для сортировки по времени последнего изменения:

Path dir = Paths.get("./path/somewhere");

Stream<Path> sortedList = Files.list(dir)
    .filter(f -> Files.isDirectory(f) == false) // exclude directories
    .sorted((f1, f2) -> (int) (f1.toFile().lastModified() - f2.toFile().lastModified()));

тогда вы можете преобразовать sortedList в Array или продолжить использовать лямбда-выражения с .forEach:

    .forEach(f -> {do something with f (f is Path)}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...