當要讀檔案列表使用類似下面程式,File.list()其實不能保證順序。
public static void main(String[] args) {
File a = new File("data");
String[] filenames;
String fullpath = a.getAbsolutePath();
if(a.isDirectory()){
filenames=a.list();
for (int i = 0 ; i < filenames.length ; i++){
File tempFile = new File(fullpath + "\\" + filenames[i]);
if(tempFile.isDirectory()){
System.out.println("目錄:" + filenames[i]);
}
else
System.out.println("檔案:" + filenames[i]);
}
}
else{
System.out.println("[" + a + "]不是目錄");
}
}
一般人跑出來的順序多半是字母順序,但這不是每個平台都一致的。
比較好的方法是用定義的Comparator排序一下才能確定順序。
一種改寫方式如下:
public class fileNameReadTest {
public static void main(String[] args) {
File a = new File("data");
File[] allfile;
String[] filenames;
String fullpath = a.getAbsolutePath();
if(a.isDirectory()){
filenames = a.list();
allfile = a.listFiles();
Arrays.sort(allfile, lastModified);
for (int i = 0 ; i < filenames.length ; i++){
File tempFile = new File(fullpath + "\\" + filenames[i]);
System.out.println("自然排序:" + filenames[i] + ", 時間排序:"+ allfile[i].getName());
}
}
else{
System.out.println("[" + a + "]不是目錄");
}
}
private static final Comparator lastModified = new Comparator() {
@Override
public int compare(File o1, File o2) {
return o1.lastModified() == o2.lastModified() ? 0 : (o1.lastModified() < o2.lastModified() ? 1 : -1 ) ;
}
};
}
本例子示範以最後修改時間方式排序,也可自行定義其他方式排序。
以下順便介紹常用的File處理會使用到的API。
FilenameFilter
這是一個interface,定義完後可以自行選擇要讀入的檔案名稱條件。
例如:
final List files = java.util.Arrays.asList("c", "b", "a");
FilenameFilter filenameFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return files.contains(name);
}
};
File[] ondisk = new File(".").listFiles(filenameFilter);
P.S.:1. File.list() 功能為取得目錄下檔案名稱字串
2. File.listFiles() 功能為取得目錄下檔案
3. 想要真正的字母排序(包含大小寫判斷)要使用apache commonIO函式庫NameFileComparator
沒有留言:
張貼留言