用Java列出某个文件目录的文件列表是很容易实现的,只用调用File类中的list()方法即可。
String[] | list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
但是此时文件的列表是按照字符串默认的排序方式进行排序的
- package cn.uestc.fz;
- import java.io.File;
- public class Filelists {
- public static void main(String[] args) {
- File file = new File("E:\\MyDoc"); //目录路径
- if(file.isDirectory()){ //判断file是否为目录
- String[] fileNames = file.list();
- for(int i=0;i<fileNames.length;i++){
- System.out.println(fileNames[i]);
- }
- }
- }
- }
运行结果:
- 1.1.txt
- 1.2.txt
- 1.3.txt
- 1.4.txt
- 10.txt
- 11.txt
- 12.1.txt
- 2.1.txt
- 2.2.txt
- 3.txt
- 4.txt
- 5.txt
- 6.txt
- 7.txt
- 8.txt
- 9.txt
显然,10号的文件排在了2号的前面,这并不是按整数的顺序排的,是按照字符的顺序排的。
那么我们怎么实现文件名按照整数序号来排序呢,首先我想到了java中的Comparable接口,用某个类继承String类再实现Comparable接口,但是list()方法返回的是String类型的数组,而String的定义是
public final class String
extends Object implements Serializable , Comparable < String >, CharSequence也就是说它不能被继承。
此时查文档发现了另外一个并不常用的接口,Comparator,它可以在不改变某个类代码的情况下,给它定义排序的规则。
- package cn.uestc.fz;
- import java.io.File;
- import java.util.Arrays;
- import java.util.Comparator;
- public class Filelists1 {
- public static void main(String[] args) {
- File file = new File("E:\\MyDoc"); //目录路径
- if(file.isDirectory()){ //判断file是否为目录
- String[] fileNames = file.list();
- Arrays.sort(fileNames,new StringComparator());
- for(int i=0;i<fileNames.length;i++){
- System.out.println(fileNames[i]);
- }
- }
- }
- }
- //此类实现Comparable接口
- class StringComparator implements Comparator<String>{
- @Override
- public int compare(String s1, String s2) {
- if(StringComparator.returnDouble(s1)<StringComparator.returnDouble(s2))
- return -1;
- else if(StringComparator.returnDouble(s1)>StringComparator.returnDouble(s2))
- return 1;
- else
- return 0;
- }
- public static double returnDouble(String str){
- StringBuffer sb = new StringBuffer();
- for(int i=0;i<str.length();i++){
- if(Character.isDigit(str.charAt(i)))
- sb.append(str.charAt(i));
- else if(str.charAt(i)=='.'&&i<str.length()-1&&Character.isDigit(str.charAt(i+1)))
- sb.append(str.charAt(i));
- else break;
- }
- if(sb.toString().isEmpty())
- return 0;
- else
- return Double.parseDouble(sb.toString());
- }
由类StringComparator实现Comparator接口就可以改变String类型的默认排序方式,其中compare是需要复写的方法,类似于Comparable接口中的compareTo方法。
returnDouble是写的一个静态方法,用来返回某个文件名字符串前面的数字编号,如"1.1.txt"返回的就是"1.1",写的时候老是出现越界异常,后来终于改成功了,可能写得有点复杂了。
这样再调用Arrays类中的sort(T[] a, Comparator<? super T> c)
方法就可以对文件名排序了。
最后的结果符合我们的预期:
- 1.1.txt
- 1.2.txt
- 1.3.txt
- 1.4.txt
- 2.1.txt
- 2.2.txt
- 3.txt
- 4.txt
- 5.txt
- 6.txt
- 7.txt
- 8.txt
- 9.txt
- 10.txt
- 11.txt
- 12.1.txt