2015年4月13日 星期一

java File讀檔案列表


當要讀檔案列表使用類似下面程式,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

沒有留言:

張貼留言