从远程 FTP 服务器获取 ZIP 第一个条目名称,而无需使用 Java 下载 zip 8+

Get ZIP first entry name from remote FTP Server without downloading the zip using Java 8+

我正在使用 FTP客户端从我的 FTP 服务器下载文件,它充满了 zip 文件夹,其中包含一个到多个 .txt 文件。它们的大小可能很大,例如... 10GB .

我想要做的是 不从 FTP 下载 zip 存档,而是读取它具有的第一个 .txt 文件的名称。保证里面至少有 1 个 .txt 文件。

我读了一篇非常有趣的文章 here 但它在 .NET 中并且他们正在使用远程 URL 这与我的情况不同。


zip 格式定义了某种指向其所有内部条目的目录。包含名称、起始偏移量、大小和其他内容等属性。而且这个目录非常小,只有几个字节放在存档的最后。

我如何与 FTPCient 一起玩?

我做了以下,据我所知没有其他答案。


示例输入 ("ftp-folder/input.txt") :

public String getZipFirstEntryName(final String remotePath) {                                                                                
    this.log.info("ENTERING getZipFirstEntry, remotePath={} ", remotePath);                                                                  

    /* Setup FTP connection */                                                                                                               
    final FTPClient ftpClient = this.setupFtpConnection();                                                                                   


    try {                                                                                                                                    
        ftpClient.changeWorkingDirectory(remotePath.split("/")[0]); /* ftp-folder */                                                                       
    } catch (final IOException e) {                                                                                                          
        e.printStackTrace();                                                                                                                 
    }                                                                                                                                        

    try (final ZipArchiveInputStream zip = new ZipArchiveInputStream(ftpClient.retrieveFileStream(remotePath.split("/")[1]))) { /* input.txt */             

        this.log.info("EXITING getZipFirstEntry, remotePath={} ", remotePath);                                                               
        return zip.getNextEntry().getName();                                                                                                 

    } catch (final IOException e) {                                                                                                          
        e.printStackTrace();               
    }                                                                                                                                        

}