Windows操作系统上的java File.listFiles()在逻辑上不是顺序的

时间:2012-03-28 08:08:30

标签: java windows

也许以前已经回答过,但我找不到它。基本上这就是问题所在。我有一个目录中的图像文件列表。它们从1-n编号,其中n -s大于10.在我的程序中,我创建一个指向文件所在目录的文件对象,然后在文件对象上调用“listFiles()”。它返回文件,但按以下顺序:

filename1.jpg
filename10.jpg
filename11.jpg
...
filename2.jpg
filename20.jpg
filename21.jpg
...

这是操作系统报告这样的文件吗?我如何阻止它这样做?

4 个答案:

答案 0 :(得分:4)

文件明确说明

  

无法保证结果数组中的名称字符串将以任何特定顺序出现;特别是,它们不保证按字母顺序出现。

所以你应该完全不依赖于此。如果您希望使用以下命令获得相同的订单,则可以对它们进行排序:

Arrays.sort(Object[] object);

Arrays.sort(T[] a, Comparator<? super T> c);

答案 1 :(得分:3)

如果您不喜欢它的排序方式,只需使用java.util.Collections.sort(list, comparator)并实现您自己的java.util.Comparator。我认为这取决于操作系统如何在该数组中对文件进行排序。

答案 2 :(得分:2)

好像没问题。尝试用前导零编号,即filename001.jpg。

确定,我的意思是操作系统按照字母顺序(技术上为ASCII字符代码)顺序返回它们。

编辑:正如其他人所指出的那样,最好的方法就是自己排序。这样您就不会依赖任何未指定的行为。我提供了一个如何使用正则表达式匹配的示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> toSort = new ArrayList<String>(Arrays.asList(
                new String[]{
                    "filename1.jpg",
                    "filename11.jpg",
                    "filename2.jpg",
                    "filename21.jpg",}));

        System.out.println(toSort);
        Collections.sort(toSort, new Comparator<String>() {

            Pattern pat = Pattern.compile("filename(\\d+)\\.jpg");

            public int compare(String a, String b) {
                Matcher matA = pat.matcher(a);
                Matcher matB = pat.matcher(b);
                matA.find();
                matB.find();
                String ga = matA.group(1);
                String gb = matB.group(1);
                return Integer.valueOf(ga).compareTo(Integer.valueOf(gb));
            }
        });
        System.out.println(toSort);
    }
}

它返回:

[filename1.jpg, filename11.jpg, filename2.jpg, filename21.jpg]
[filename1.jpg, filename2.jpg, filename11.jpg, filename21.jpg]

答案 3 :(得分:1)

正如'listFiles()'文档所说:

  

无法保证结果数组中的名称字符串   将以任何特定顺序出现;特别是,它们不是   保证按字母顺序出现。

因此,您可以将它们命名为Rekin,然后对这些文件名进行排序。