2013-12-14 106 views
0

我使用Apache FTPClient使用以下庫使用Apache FTPclient進行排序,並下載使用Collections.sort()文件

import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPConnectionClosedException; 
import org.apache.commons.net.ftp.FTPFile; 
import org.apache.commons.net.ftp.FTPFileFilter; 

的文件在FTP文件夾從FTP站點下載文件是在格式如下

NNNN_YYYYMMDDHHMMSS.SSS 

例子提供如下:

32345_20131224091824445.zip 
42345_20131224091824545.zip 
12345_20131224091824145.zip 
22345_20131224091824345.zip 
52345_20131224091824745.zip 
62345_20131224091824645.zip 

我做什麼的現在是我使用listDir()方法列出目錄中的文件,並將每個文件名添加到ArrayList中。

然後,我使用Collections.sort(myArrayOfFileNames)對ArrayList進行排序。這對我來說很有效,因爲它按文件名排序文件。

現在我想通過文件名(不是系統時間戳)上的時間戳排序文件。這意味着在進行排序之前,我必須以某種方式去除之前包括_字符在內的所有內容。

鑑於我需要完整的文件名能夠在排序後下載文件,我想我應該有某種鍵,價值地圖,我將存儲全名作爲關鍵和剝離值作爲地圖中的「值」,然後對值進行排序。我的地圖會是這個樣子

key       value 
32345_20131224091824445.zip 20131224091824445.zip 
42345_20131224091824545.zip 20131224091824545.zip 
12345_20131224091824145.zip 20131224091824145.zip 
22345_20131224091824345.zip 20131224091824345.zip 
52345_20131224091824745.zip 20131224091824745.zip 
62345_20131224091824645.zip 20131224091824645.zip 

上述解決方案可能會工作,但有一個更快的或清潔的解決方案,因爲我覺得上述方案可能不是最好的。

+1

我想了解爲什麼你需要這個hashmap。如果剝離數字是唯一的問題,那麼去掉這些數字(在_之前)然後將它們存儲在數組列表中是多麼困難。 – Ashish

+0

因爲我需要知道什麼原始文件名是能夠下載文件。要下載文件名,我必須提供完整的名稱。 – ziggy

+0

我必須獲取文件名列表,對它們進行排序,然後使用排序列表以正確的順序下載文件。在下載期間,我只能指定正確的完整文件名,而不是帶有已刪除數字的文件名,因此我必須將兩者都存儲在地圖中。 – ziggy

回答

1

使用您的自定義比較器和文件的排序列表。應該很容易實現這個比較器,只需對文件名進行子串處理並進行比較。

List<String> files = new ArrayList<String>(); 
files.add("42345_20131224091824545.zip"); 
files.add("12345_20131224091824145.zip"); 

Collections.sort(files, new Comparator<String>() { 
    public int compare(String o1, String o2) { 
     String s1 = o1.substring(6, 21); 
     String s2 = o1.substring(6, 21); 
     return s1.compareTo(s2); 
    } 
}); 

PS。您的列表仍然會保留您的原始對象,因此您不需要任何地圖同時具有原始文件名和已刪除的文件名。這是比較器的內部細節。

+0

這看起來很有趣。我會嘗試,但如果你能給我看一個非常有用的例子。 – ziggy

+0

好的,我將啓動一個IDE並執行它。 –

+0

好吧,我必須升級IDE,同時我會嘗試在沒有代碼完成和編譯的情況下進行編碼:-) –

相關問題