如何根据文件名中的日期获取最新文件?

问题描述 投票:0回答:2

我有一个目录,其中包含这样的文件:

users_20221104.txt
users_20221105.txt
users_20221106.txt
dealers_20221104.txt
dealers_20221105.txt
dealers_20221106.txt
nations_20221104.txt
nations_20221105.txt
nations_20221106.txt

我只需要检索每次出现的最后一个文件,这意味着

users_20221106
dealers_20221106
nations_20221106

目前我有这样的事情:

private void downloadFiles()  {
    List<String> filesPath = ftpClient.listFiles(ftpFolderIn);
    String usersFileTxt = null;
    String dealerFileTxt = null;
    String nationFileTxt = null;
    
    for (String filepath : filesPath) {
        if (filepath.contains("users")) {
            usersFileTxt = filepath;
        }
        if (filepath.contains("dealers")) {
            dealerFileTxt = filepath;
        }
        if (filepath.contains("nations")) {
            nationFileTxt = filepath;
        }
    }
    usersFile = ftpClient.downloadFile(usersFileTxt);
    dealerFile = ftpClient.downloadFile(dealerFileTxt);
    nationFile = ftpClient.downloadFile(nationFileTxt);
}
java file date for-loop java-stream
2个回答
2
投票

循环浏览您的文件名。

提取日期部分。一种方法是使用

String
类上的方法,例如
split
replace

将日期部分解析为

LocalDate
。使用预定义的格式化程序来解析标准 ISO 8601 格式的“基本”(压缩)版本。

LocalDate ld = LocalDate.parse( input , DateTimeFormatter.BASIC_ISO_DATE ) ;

使用自然顺序比较日期,即

isBefore
isAfter
isEqual
。循环时记住哪个文件具有最新日期。


2
投票

一种干净的方法是创建一个

Compartor
并通过使用相应的前缀对其进行初始化来将其与流一起使用。

演示

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

class FilesComparator implements Comparator<String> {
    private String prefix;

    FilesComparator(String prefix) {
        this.prefix = prefix;
    }

    @Override
    public int compare(String s1, String s2) {
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("'" + prefix + "'uuuuMMdd'.txt'");
        LocalDate ldt1 = LocalDate.parse(s1, parser);
        LocalDate ldt2 = LocalDate.parse(s2, parser);
        return ldt1.compareTo(ldt2);
    }
}

public class Main {
    public static void main(String[] args) {
        List<String> files = List.of(
                "users_20221104.txt", "users_20221106.txt", "users_20221105.txt",
                "dealers_20221104.txt", "dealers_20221106.txt", "dealers_20221105.txt",
                "nations_20221104.txt", "nations_20221106.txt", "nations_20221105.txt");

        String usersFileTxt = getLatestFile(files, "users_").get();
        System.out.println(usersFileTxt);

        String dealersFileTxt = getLatestFile(files, "dealers_").get();
        System.out.println(dealersFileTxt);

        String nationsFileTxt = getLatestFile(files, "nations_").get();
        System.out.println(nationsFileTxt);
    }

    static Optional<String> getLatestFile(List<String> files, String prefix) {
        return files.stream()
                .filter(filename -> filename.startsWith(prefix))
                .max(new FilesComparator(prefix));
    }
}

输出

users_20221106.txt
dealers_20221106.txt
nations_20221106.txt

Trail:日期时间

了解有关现代日期时间 API 的更多信息
© www.soinside.com 2019 - 2024. All rights reserved.