JAVA8:查找文件名中包含最新日期的文件
我在FTP文件夹中有几个文件,名称如下: mainimport_31052017.csvJAVA8:查找文件名中包含最新日期的文件,java,collections,java-8,Java,Collections,Java 8,我在FTP文件夹中有几个文件,名称如下: mainimport_31052017.csv mainimport_21052017.csv mainimport_15052017.csv 我有一个模式字符串: 字符串模式=“mainport\u ddmmyyy” 现在我应该下载标题中有最新日期的文件。我应该用Java8来做这件事 我有一个解决方案,但这还不够漂亮,我用两种说法来说明: 1) 我首先得到最新的日期: Date newestDate = Collections.max(ftpFiles
mainimport_21052017.csv
mainimport_15052017.csv 我有一个模式字符串: 字符串模式=“mainport\u ddmmyyy” 现在我应该下载标题中有最新日期的文件。我应该用Java8来做这件事 我有一个解决方案,但这还不够漂亮,我用两种说法来说明: 1) 我首先得到最新的日期:
Date newestDate = Collections.max(ftpFiles.stream().filter(fileName -> StringUtils.startsWith(fileName.getName(), prefix)).map(fileName -> {
String fileNameSuffix = fileName.getName().split("_")[1];
Date date = null;
try {
date = dateFormat.parse(fileNameSuffix);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}).collect(Collectors.toList()));
2) 然后,我将获得文件名和最新日期:
Optional<FTPFile> file = ftpFiles.stream().filter(fileName->{
String fileNameSuffix = fileName.getName().split("_")[1];
Date date = null;
try {
date = dateFormat.parse(fileNameSuffix);
} catch (ParseException e) {
e.printStackTrace();
}
return StringUtils.startsWith(fileName.getName(), prefix) && date.equals(newestDate);
}).findFirst();
Optional file=ftpFiles.stream().filter(文件名->{
字符串fileNameSuffix=fileName.getName().split(“”)[1];
日期=空;
试一试{
date=dateFormat.parse(fileNameSuffix);
}捕获(解析异常){
e、 printStackTrace();
}
返回StringUtils.startsWith(fileName.getName(),前缀)和&date.equals(newestDate);
}).findFirst();
如果可能的话,我试图在一条语句中同时实现这两个功能。假设日期始终具有指定的六个字符表示形式,您可以使用
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> file.getName()
.replaceFirst(".*_([0-9]{2})([0-9]{2})([0-9]{4}).*", "$3$2$1")));
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> {
String name = file.getName();
name = name.substring(name.indexOf('_')+1);
try {
return dateFormat.parse(name);
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}));
如果日期格式是不可避免的先决条件,则可以使用
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> file.getName()
.replaceFirst(".*_([0-9]{2})([0-9]{2})([0-9]{4}).*", "$3$2$1")));
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> {
String name = file.getName();
name = name.substring(name.indexOf('_')+1);
try {
return dateFormat.parse(name);
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}));
假设日期始终具有指定的六个字符表示形式,则可以使用
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> file.getName()
.replaceFirst(".*_([0-9]{2})([0-9]{2})([0-9]{4}).*", "$3$2$1")));
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> {
String name = file.getName();
name = name.substring(name.indexOf('_')+1);
try {
return dateFormat.parse(name);
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}));
如果日期格式是不可避免的先决条件,则可以使用
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> file.getName()
.replaceFirst(".*_([0-9]{2})([0-9]{2})([0-9]{4}).*", "$3$2$1")));
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> {
String name = file.getName();
name = name.substring(name.indexOf('_')+1);
try {
return dateFormat.parse(name);
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}));
“不够漂亮”的工作代码不属于堆栈溢出。如果你想使用Java 8“goodies”,那么你不应该使用
Date
或Calendar
类,而应该使用Java.time
包及其子包或“yoda time”,因为几乎所有的事情都比使用日历和日期好^^^只是一个提示:您可以在流上调用max
,而不是收集到列表中,并将该List
传递到Collections.max
。如果您提供了一个比较日期的比较器
,您就可以首先获得文件。无需使用Date
或java.time
;只需使用直接作用于文件名的比较器
。如果你想使用Java 8“goodies”,那么你不应该使用Date
或Calendar
类,而应该使用Java.time
包及其子包或“yoda time”,因为几乎所有的事情都比使用日历和日期好^^^只是一个提示:您可以在流上调用max
,而不是收集到列表中,并将该List
传递到Collections.max
。如果您提供了一个比较日期的比较器
,您就可以首先获得文件。无需使用Date
或java.time
;只需使用一个直接作用于文件名的比较器就可以了。这看起来很有趣,但文件名可以更改,我的意思是,它可以是mmddyy或ddmmyy或其他什么,所以我首先尝试将它转换为date。@Marci man:没有解析器能神奇地检测出你是指mmddyy
还是ddmmyy
,因此,在任何情况下都必须重新配置解析器。在我的回答中,使用mmddyyyy
而不是ddmmyyyy
就像将“$3$2$1”
更改为“$3$1$2”
一样简单。当然,只有在您了解了它的功能之后,才可以维护它。调整它以支持yy
以及yyy
会有点困难,但我强烈反对使用两位数的年份。但是,您可以使用比较器。比较
来创建基于日期
解析器的比较器,效率会稍低。不,这不是我的意思,我事先得到了一个格式:mainport_ddmmyy。这段信息已经存在。这看起来很有趣,但是文件名可以更改,我的意思是,它可以是mmddyy或ddmmyy或其他任何东西,所以我尝试先将其转换为日期。@Marci man:没有解析器能神奇地检测出您的意思是mmddyy
还是ddmmyy
,因此,在任何情况下都必须重新配置解析器。在我的回答中,使用mmddyyyy
而不是ddmmyyyy
就像将“$3$2$1”
更改为“$3$1$2”
一样简单。当然,只有在您了解了它的功能之后,才可以维护它。调整它以支持yy
以及yyy
会有点困难,但我强烈反对使用两位数的年份。但是,您可以使用比较器。比较
来创建基于日期
解析器的比较器,效率会稍低。不,这不是我的意思,我事先得到了一个格式:mainport_ddmmyy。这条信息已经存在了。