Java 使用ApacheFTPClient使用Collections.sort()对文件进行排序和下载

Java 使用ApacheFTPClient使用Collections.sort()对文件进行排序和下载,java,file-io,ftp,Java,File Io,Ftp,我使用ApacheFTPClient使用以下库从FTP站点下载文件 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文件夹中的文件采用以下

我使用ApacheFTPClient使用以下库从FTP站点下载文件

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文件夹中的文件采用以下格式

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进行排序。这对我来说非常有效,因为它按文件名对文件进行排序

现在我想按照文件名上的时间戳(而不是系统时间戳)对文件进行排序。这意味着我必须在排序之前去掉所有内容,包括u字符

考虑到我需要完整的文件名才能在排序后下载文件,我想我应该有某种键、值映射,在其中我将全名存储为键,将剥离的值存储为映射中的“值”,然后对值进行排序。我的地图看起来像这样

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

上述解决方案可能有效,但是否有更快或更干净的解决方案,因为我觉得上述解决方案可能不是最好的

使用自定义比较器和文件排序列表。应该很容易实现这个比较器,只需对文件名进行子串并进行比较

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);
    }
});
List files=new ArrayList();
添加(“42345_20131224091824545.zip”);
添加(“12345_20131224091824145.zip”);
Collections.sort(文件、新比较器(){
公共整数比较(字符串o1、字符串o2){
字符串s1=o1。子字符串(6,21);
字符串s2=o1.子字符串(6,21);
返回s1.compareTo(s2);
}
});

另外,您的列表仍将保留原始对象,因此您不需要任何贴图来同时具有原始文件名和剥离文件名。这是比较器的内部细节。

我试图理解为什么您需要一个hashmap。如果剥离数字是唯一的问题,那么剥离这些数字(在u之前)并将其存储在arraylist中会有多困难。因为我需要知道原始文件名是什么才能下载文件。要下载文件名,我必须提供完整的名称。我必须获得文件名列表,对它们进行排序,然后使用排序后的列表以正确的顺序下载文件。在下载过程中,我只能指定正确的完整文件名,而不是带有剥离数字的文件名,因此我必须在地图中同时存储这两个文件名。在“\u”之前的这些数字是否总是唯一的?是的,这些数字总是唯一的。这看起来很有趣。我会尝试,但如果你能给我一个非常有用的例子。好吧,我必须升级IDE,同时我会尝试在没有代码完成和编译的情况下编写它:-)