java 遍历本地目录中文件(文件数量比较大),for循环按id顺序

java 遍历本地目录中文件(文件数量比较大),for循环按id顺序得到的结果为什么是1,10,100,101,102,...,109,11......
我希望得到的文件按顺序是从1依次递增到最后,及Log_1.a,Log_2.a,Log_3.a,Log_4.a……

FileName: Log_1.a
FileName: Log_10.a
FileName: Log_100.a
FileName: Log_101.a
FileName: Log_102.a
FileName: Log_103.a
FileName: Log_104.a
FileName: Log_105.a
FileName: Log_106.a
FileName: Log_107.a
FileName: Log_108.a
FileName: Log_109.a
FileName: Log_11.a
FileName: Log_110.a
FileName: Log_111.a
FileName: Log_112.a
FileName: Log_113.a
FileName: Log_114.a
FileName: Log_115.a
FileName: Log_116.a
FileName: Log_117.a
FileName: Log_118.a
FileName: Log_119.a
FileName: Log_12.a
FileName: Log_120.a
FileName: Log_121.a
FileName: Log_122.a
FileName: Log_123.a
FileName: Log_124.a
FileName: Log_125.a
FileName: Log_126.a
FileName: Log_127.a
FileName: Log_128.a
FileName: Log_129.a
FileName: Log_13.a
FileName: Log_130.a
FileName: Log_131.a
FileName: Log_132.a

帮你写了个完整的程序,拿去用吧。

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Test4 {

class DirFilter implements FilenameFilter {

    public String suffix = null;
    public String endwith = null;

    public boolean accept(File dir, String name) {

        //return (name.toLowerCase().contains(suffix)) && (name.toLowerCase().endsWith(endwith));
        return (name.contains(suffix)) && (name.contains(endwith));
    }

    public void SetSuffix(String suffixStr) {
        suffix = suffixStr;
    }

    public void SetEndWith(String endWtihStr) {
        endwith = endWtihStr;
    }

}   

public class SelfComparator implements Comparator<File> {

    public int compare(File o1, File o2) {
        return  Integer.valueOf(getNum(o1.getName())).compareTo(Integer.valueOf(getNum(o2.getName()))); 
    }

    public int getNum(String filename){
        int num;
        String numStr= filename.substring("Log_".length(), filename.indexOf(".a"));
        if ("".equals(numStr)){
            num=0;
        }else{
            num=Integer.parseInt(numStr);
        }
        return num;
    }
}

public void excute() {
    File dir = new File("D://directory");
    DirFilter difFilter = new DirFilter();
    difFilter.SetSuffix("Log_");
    difFilter.SetEndWith(".a");
    File[] files = dir.listFiles(difFilter);
    if (files.length <= 1) {
        return;
    } else {
        List<File> fileList = new ArrayList<File>();
        fileList.addAll(Arrays.asList(files));
        Collections.sort(fileList, new SelfComparator());
        int list_size = fileList.size();
        for (int i=0; i<list_size; i++) {
            System.out.println("filename is :" + fileList.get(i));
        }
    }
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Test4 test = new Test4();
    test.excute();

}

}

 因为默认是按照字符顺序排序,11a和111a相比,前两位相同,a>1,所以111a在前面。你需要实现一个自己的Comparer,转换成数字,再比较,或者先按照字符串长度比较,再按照字符串比较。

因为目录类默认是按字典序顺序,所以你自己要重载比较函数

为什么不把FileName按照"_"和"."截取,然后按照你需要的顺序排一下序

请问你只是想得到文件名的列表么,如果这样你完全可以得到文件数量,然后利用for循环重新生成一下名字,不知道这样对不对

重载下比较器,改变默认的排序方式

循环控制语句 ,里面用问题