2011-02-15 38 views
4

我是初學者,我發現了一個關於java中lastmodified文件的舊線程。 我想要的只是從一個目錄中獲得10個最近的文件並將它們移動到另一個目錄。如何使用Java只從目錄中獲取最後修改的10個文件?

在此論壇中找到的此代碼運行良好,但它獲取目錄中的所有文件並使用日期對它們進行排序。

任何幫助將aprreciated, 謝謝

下面是代碼:

import java.io.File; 
import java.util.Arrays; 
import java.util.Comparator; 


public class Newest { 
    public static void main(String[] args) { 
     File dir = new File("C:\\your\\dir"); 
     File [] files = dir.listFiles(); 
     Arrays.sort(files, new Comparator(){ 
      public int compare(Object o1, Object o2) { 
       return compare((File)o1, (File)o2); 
      } 
      private int compare(File f1, File f2){ 
       long result = f2.lastModified() - f1.lastModified(); 
       if(result > 0){ 
        return 1; 
       } else if(result < 0){ 
        return -1; 
       } else { 
        return 0; 
       } 
      } 
     }); 
     System.out.println(Arrays.asList(files)); 
    } 
} 

我是初學者在這裏,對不起,如果使用論壇犯了一些錯誤。

所以對我來說我不知道​​如何將上面的代碼插入新代碼。

如果我保留第一個代碼,我想將10個最近的文件存儲到另一個文件夾中,但是它將所有文件放入目錄中。

任何幫助,請

謝謝

import java.io.File; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.io.*; 
import java.text.*; 
import java.util.*; 




    public class Newest 
    { 
     public static void main(String[] args) 
     { 
      File dir = new File("c:\\File"); 
      File[] files = dir.listFiles(); 
      Arrays.sort(files, new Comparator<File>() 
      { 
       public int compare(File f1, File f2) 
       { 
        return Long.valueOf(f2.lastModified()).compareTo 
          (
          f1.lastModified()); 
       } 
      }); 
      //System.out.println(Arrays.asList(files)); 
      for(int i=0, length=Math.min(files.length, 12); i<length; i++) { 
     System.out.println(files[i]); 


    for (File f : files) { 
      System.out.println(f.getName() + " " + sdf.format(new Date(f.lastModified()))); 
      File dir = new File("c://Target"); 
      boolean success = f.renameTo(new File(dir,f.getName())); 
      if (!success) 


      } 
     } 
    } 

回答

5

在你的代碼示例,更改:

System.out.println(Arrays.asList(files)); 

到:

for(int i=0, length=Math.min(files.length, 10); i<length; i++) { 
    System.out.println(files[i]); 
} 
+0

非常感謝您的回覆。 – user618111 2011-02-15 16:23:13

+0

@ user618111:不客氣。如果您發現此答案有幫助,請通過選中左側答案旁邊的複選標記將其標記爲正確。 – Asaph 2011-02-15 16:31:07

1

操作系統不走一個排序程序尋找文件。因此,唯一的解決方案是抓取所有文件(以確保您不會跳過您想要的文件之一)並自行排序。

文件系統通常會提供基於文件名抓取文件的例程,Java通過list(...)公開參數,該參數需要FileFilter參數。在Java 1.7中(無論何時釋放它),都有新的面向文件的工具,它們將允許您訪問底層文件系統的抽象。有了這樣的設施,人們可以設想創建一個文件訪問者,但這不會對情況有太大​​的幫助,因爲您不知道哪些文件可能會跳過而沒有真正查看它的修改時間。這意味着,即使有訪問界面,您仍然需要檢查每個文件的修改時間,以確保您不會錯過您想要的十個文件中的一個。

3

獲取所有文件,然後對其進行排序是唯一符合規範的「正確」方法。但這裏有另外一種方法,它使用FileFilter作爲訪問者並進行即時插入排序。在我的機器的性能上的目錄更好的約4倍,2300頁的文件(圖像目錄)

private File[] getTopFiles() { 
    File dir = new File("C:\\icons_svr"); 
    SortFilter filter = new SortFilter(10); 
    dir.listFiles(filter);  
    File[] topFiles = new File[10]; 
    return filter.topFiles.toArray(topFiles); 
} 

代碼InsertionSortFilter:

class SortFilter implements FileFilter { 

     final LinkedList<File> topFiles; 
     private final int n; 

     public SortFilter(int n) { 
      this.n = n; 
      topFiles = new LinkedList<File>(); 
     } 

     public boolean accept(File newF) { 
      long newT = newF.lastModified(); 

      if(topFiles.size()==0){ 
       //list is empty, so we can add this one for sure 
       topFiles.add(newF); 
      } else { 
       int limit = topFiles.size()<n?topFiles.size():n; 
       //find a place to insert 
       int i=0; 
       while(i<limit && newT <= topFiles.get(i).lastModified()) 
        i++; 

       if(i<limit){ //found 
        topFiles.add(i, newF); 
        if(topFiles.size()>n) //more than limit, so discard the last one. Maintain list at size n 
         topFiles.removeLast(); 
       } 
      } 
      return false; 
     } 

    } 
相關問題