我正在使用 apache FTPClient 使用以下库从 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 进行排序。这对我来说非常有效,因为它按文件名对文件进行排序。
现在我想按文件名上的时间戳(而不是系统时间戳)对文件进行排序。这意味着我必须在进行排序之前以某种方式删除之前的所有内容并包括 _ 字符。
鉴于我需要完整的文件名才能在排序后下载文件,我想我应该有某种键、值映射,其中我将全名存储为键,将删除的值存储为 map 中的“值”,然后对值进行排序。我的 map 看起来像这样
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);
}
});
PS。您的列表仍将保留原始对象,因此您不需要任何 map 即可同时具有原始文件名和剥离的文件名。这是比较器的内部细节。
关于java - 使用 apache FTPclient 使用 Collections.sort() 排序和下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20584720/