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循环重新生成一下名字,不知道这样对不对
重载下比较器,改变默认的排序方式
循环控制语句 ,里面用问题