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

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

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

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

Solutions Collecting From Web of "在Windows操作系统上的java File.listFiles()不是逻辑顺序的"

文件明确指出

不能保证结果数组中的名称字符串将以任何特定顺序出现; 他们并不特别保证按字母顺序出现。

所以你应该不要依赖这个。 如果你想要得到相同的订单,你可以对它们进行排序,使用:

Arrays.sort(Object[] object); 

要么

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

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

这似乎没问题。 尝试使用前导零来编号,即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] 

由于“listFiles()”文档说:

不能保证结果数组中的名称字符串将以任何特定顺序出现; 他们并不特别保证按字母顺序出现。

所以你可以把它们命名为Rekin说,然后对这些文件名进行排序。