有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中使用SFTP获取目录的最新文件?

我正在尝试使用SFTP获取目录的最新文件。当目录中只有一个文件时,下面的代码给出了正确的最新文件。如果一段时间后在目录中创建了一个新文件,如果我再次运行下面的代码,它不会给出正确的最新文件,而是返回相同的旧文件。(为了运行下面的代码,我正在使用计时器调度器)

//to have List of all the files of particular directory
List<File> files1 = new ArrayList<File>();  
Vector<LsEntry> files = sftpChannel.ls(filePath+"*.csv");

for (LsEntry entry : files)
  {
      if (!entry.getFilename().equals(".") && !entry.getFilename().equals(".."))
      {

       File f=new File(entry.getFilename());
      files1.add(f);

      }
  }  

System.out.println("files length "+files1.size());
File[] files2=files1.toArray(new File[files1.size()]);  
long lastMod = Long.MIN_VALUE;
File choice = null;
for (File file : files2) {
    if (file.lastModified() > lastMod) {
        choice = file;
        lastMod = file.lastModified();
    }
}
lastModifiedFile=choice;

我甚至试着使用下面的代码。它也没有给出正确的最新文件

if (files2.length > 0) {
    //** The newest file comes first 
    Arrays.sort(files2, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
    lastModifiedFile = files2[0];
}

共 (1) 个答案

  1. # 1 楼答案

    这可以通过集合或流来完成。类与Java集合完全兼容:

    Vector<LsEntry> list = channelSftp.ls(filePath + "*.csv");
    ChannelSftp.LsEntry lastModifiedEntry = Collections.max(list,
        (Comparator.comparingInt(entry-> entry.getAttrs().getMTime()))
    );
    

    或者

    LsEntry lastModifiedEntry = list.stream().max(
        Comparator.comparingInt(entry -> entry.getAttrs().getMTime())
    ).get();