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

如何在Java中使用SFTP获取目录的最新文件?,java,sftp,jsch,Java,Sftp,Jsch,我正在尝试使用SFTP获取目录的最新文件。当目录中只有一个文件时,下面的代码给出了正确的最新文件。如果一段时间后在目录中创建了一个新文件,如果我再次运行下面的代码,它不会给出正确的最新文件,而是返回相同的旧文件。(要运行下面的代码,我使用的是计时器调度器) 使用LsEntry.getAttrs().getMTime()查询SFTP服务器上文件的修改时间 Vector<LsEntry> files = channelSftp.ls(filePath + "*.csv"); LsEntr

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

使用
LsEntry.getAttrs().getMTime()
查询SFTP服务器上文件的修改时间

Vector<LsEntry> files = channelSftp.ls(filePath + "*.csv");
LsEntry newestEntry = null;
for (LsEntry entry : files)
{
    if (!entry.getFilename().equals(".") && !entry.getFilename().equals(".."))
    {
        if ((newestEntry == null) ||
            (newestEntry.getAttrs().getMTime() < entry.getAttrs().getMTime()))
        {
            newestEntry = entry;
        }
    }
}

if (newestEntry != null)
{
    System.out.println(
        "Newest file is " + newestEntry.getFilename() +
        " with timestamp " + newestEntry.getAttrs().getMtimeString());
}
向量文件=channelSftp.ls(filePath+“*.csv”); LsEntry newestEntry=null; 用于(LsEntry条目:文件) { 如果(!entry.getFilename().equals(“.”&&!entry.getFilename().equals(“..”) { if((newestEntry==null)|| (newestEntry.getAttrs().getMTime()

解释代码不起作用的原因:只将文件名复制到
文件
列表中,因此
文件.lastModified()
无法返回任何相关值。此外,
文件
对象仅用于本地文件。

它可以用于集合或流,因为Vector.class与Java集合完全兼容:

Vector<LsEntry> list = channelSftp.ls(filePath + "*.csv");
ChannelSftp.LsEntry lastModifiedEntry = Collections.max(list,
    (Comparator.comparingInt(entry-> entry.getAttrs().getMTime()))
);
Vector<LsEntry> files = channelSftp.ls(filePath + "*.csv");
LsEntry newestEntry = null;
for (LsEntry entry : files)
{
    if (!entry.getFilename().equals(".") && !entry.getFilename().equals(".."))
    {
        if ((newestEntry == null) ||
            (newestEntry.getAttrs().getMTime() < entry.getAttrs().getMTime()))
        {
            newestEntry = entry;
        }
    }
}

if (newestEntry != null)
{
    System.out.println(
        "Newest file is " + newestEntry.getFilename() +
        " with timestamp " + newestEntry.getAttrs().getMtimeString());
}
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();