Java如何根据文件和目录的大小对其排序?

在此示例中,您将学习如何根据文件和目录的大小对其进行排序。使用Apache Commons IO,我们可以利用SizeFileComparator该类。此类提供了一些实例来对文件大小进行排序,例如:

比较器描述
SIZE_COMPARATOR大小比较器实例–目录被视为零大小
SIZE_REVERSE反向大小比较器实例–目录被视为零大小
SIZE_SUMDIR_COMPARATOR大小比较器实例,该实例将目录内容的大小相加
SIZE_SUMDIR_REVERSE反向大小比较器实例,该实例求和目录内容的大小

现在,让我们跳到下面的代码片段:

package org.nhooo.example.commons.io;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.util.Arrays;

import static org.apache.commons.io.comparator.SizeFileComparator.*;

public class FileSortBySize {
    public static void main(String[] args) {
        File dir = new File(".");
        File[] files = dir.listFiles();

        if (files != null) {
            // 根据文件大小以升序对文件进行排序。
            System.out.println("Ascending order.");
            Arrays.sort(files, SIZE_COMPARATOR);
            FileSortBySize.displayFileOrder(files, false);

            // 根据文件大小按降序排列文件
            System.out.println("Descending order.");
            Arrays.sort(files, SIZE_REVERSE);
            FileSortBySize.displayFileOrder(files, false);

            // 根据文件/目录升序排序文件
            // 尺寸
            System.out.println("Ascending order with directories.");
            Arrays.sort(files, SIZE_SUMDIR_COMPARATOR);
            FileSortBySize.displayFileOrder(files, true);

            // 根据文件/目录以降序对文件进行排序
            // 尺寸
            System.out.println("Descending order with directories.");
            Arrays.sort(files, SIZE_SUMDIR_REVERSE);
            FileSortBySize.displayFileOrder(files, true);
        }
    }

    private static void displayFileOrder(File[] files, boolean displayDirectory) {
        for (File file : files) {
            if (!file.isDirectory()) {
                System.out.printf("%-25s - %s%n", file.getName(),
                        FileUtils.byteCountToDisplaySize(file.length()));
            } else if (displayDirectory) {
                long size = FileUtils.sizeOfDirectory(file);
                String friendlySize = FileUtils.byteCountToDisplaySize(size);
                System.out.printf("%-25s - %s%n", file.getName(),
                        friendlySize);
            }
        }
        System.out.println("------------------------------------");
    }
}

在上面的代码段中,我们从FileUtils类中使用了一对方法,例如FileUtils.sizeOfDirectory()计算目录的大小和FileUtils.byteCountToDisplaySize()创建人类可读文件的大小。

代码段的结果:

Ascending order.
.editorconfig             - 389 bytes
nhooo.iml              - 868 bytes
pom.xml                   - 1 KB
------------------------------------
Descending order.
pom.xml                   - 1 KB
nhooo.iml              - 868 bytes
.editorconfig             - 389 bytes
------------------------------------
Ascending order with directories.
.editorconfig             - 389 bytes
src                       - 851 bytes
nhooo.iml              - 868 bytes
pom.xml                   - 1 KB
apache-commons-example    - 8 KB
hibernate-example         - 29 KB
.idea                     - 85 KB
------------------------------------
Descending order with directories.
.idea                     - 85 KB
hibernate-example         - 29 KB
apache-commons-example    - 8 KB
pom.xml                   - 1 KB
nhooo.iml              - 868 bytes
src                       - 851 bytes
.editorconfig             - 389 bytes

Maven依赖

<!-- http://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>