java文件排序顺序与windows和linux的区别

vrb*_*lgi 4 java linux windows sorting

我在Windows/Linux中有一个文件夹,下面有文件

test_1a.play
test_1AA.play
test_1aaa.play
test-_1AAAA.play
Run Code Online (Sandbox Code Playgroud)

我正在读取文件并存储它但是windows和linux给出了不同的顺序.由于我的应用程序在两个平台上运行,我需要一致的顺序(Linux命令).任何修复此问题的建议.

File root = new File( path );
File[] list = root.listFiles();
list<File> listofFiles = new ArrayList<File>();
.....
for ( File f : list ) {


...
read and store file in listofFiles
...
}
Collections.sort(listofFiles);
Run Code Online (Sandbox Code Playgroud)

Windows给我下面的订单

test-_1AAAA.play
test_1a.play
test_1AA.play
test_1aaa.play
Run Code Online (Sandbox Code Playgroud)

Linux给了我以下订单

test-_1AAAA.play
test_1AA.play
test_1a.play
test_1aaa.play
Run Code Online (Sandbox Code Playgroud)

dac*_*cwe 7

Comparator<File>由于File.compareTo使用"系统"命令,您需要实现自己的.

我认为(未检查)Linux使用文件名的"标准"顺序(区分大小写),因此示例实现可能如下所示:

public static void main(String[] args) {
    List<File> files = new ArrayList<File>();
    files.add(new File("test_1a.play"));
    files.add(new File("test_1AA.play"));
    files.add(new File("test_1aaa.play"));
    files.add(new File("test-_1AAAA.play"));

    Collections.sort(files, new Comparator<File>() {
        @Override
        public int compare(File o1, File o2) {
            String p1 = o1.getAbsolutePath();
            String p2 = o2.getAbsolutePath();
            return p1.compareTo(p2);
        }
    });

    System.out.println(files);
}
Run Code Online (Sandbox Code Playgroud)

输出:

[test-_1AAAA.play, test_1AA.play, test_1a.play, test_1aaa.play]
Run Code Online (Sandbox Code Playgroud)

  • @goldilocks:`File.getName`返回文件路径的"最后"名称.对不同目录中的文件进行排序最终会"一起",这听起来没有意义.`File.getAbsolutePath`获取整个路径(包括姓氏),而不仅仅是姓氏. (3认同)