Java如何按文件扩展名对文件名进行排序?

要按扩展名对文件名进行排序,我们可以使用ExtensionFileComparatorApache Commons IO库中的类。此类提供了一些比较器实例,例如:

比较器描述
EXTENSION_COMPARATOR区分大小写的扩展比较器
EXTENSION_REVERSE反向区分大小写的扩展比较器
EXTENSION_INSENSITIVE_COMPARATOR不区分大小写的扩展比较器
EXTENSION_INSENSITIVE_REVERSE反向不区分大小写的扩展比较器
EXTENSION_SYSTEM_COMPARATOR系统敏感扩展比较器
EXTENSION_SYSTEM_REVERSE反向系统敏感路径比较器

以下代码段显示了如何使用上面列出的前两个比较器。

package org.nhooo.example.commons.io;

import org.apache.commons.io.FilenameUtils;
import static org.apache.commons.io.comparator.ExtensionFileComparator.*;

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

public class FileSortByExtension {
    public static void main(String[] args) {
        File file = new File(".");

        // 排除列表中的目录
        File[] files = file.listFiles(File::isFile);

        if (files != null) {
            // 升序排列。
            Arrays.sort(files, EXTENSION_COMPARATOR);
            FileSortByExtension.displayFileOrder(files);

            // 降序排列。
            Arrays.sort(files, EXTENSION_REVERSE);
            FileSortByExtension.displayFileOrder(files);
        }
    }

    private static void displayFileOrder(File[] files) {
        System.out.printf("%-20s | %s%n", "Name", "Ext");
        System.out.println("--------------------------------");
        for (File file : files) {
            System.out.printf("%-20s | %s%n", file.getName(),
                    FilenameUtils.getExtension(file.getName()));
        }
        System.out.println();
    }
}

代码段的结果:

Name                 | Ext
--------------------------------
README               | 
lipsum.doc           | doc
lipsum.docx          | docx
data.html            | html
contributors.txt     | txt
pom.xml              | xml

Name                 | Ext
--------------------------------
pom.xml              | xml
contributors.txt     | txt
data.html            | html
lipsum.docx          | docx
lipsum.doc           | doc
README               |

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>