【问题标题】:Get ZIP first entry name from remote FTP Server without downloading the zip using Java 8+从远程 FTP 服务器获取 ZIP 第一个条目名称,无需使用 Java 8+ 下载 zip
【发布时间】:2019-11-20 22:12:39
【问题描述】:

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

我想要做的是在不从 FTP 下载 zip 存档的情况下读取它拥有的第一个 .txt 文件的名称。保证其中至少有 1 个.txt 文件。

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


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

如何使用 FTPCient 解决它?

【问题讨论】:

  • 我会使用JSch之类的东西来建立SSH连接并执行一些shell命令来读取ZIP文件的内容。
  • 这不是矫枉过正吗?我们有普通的 FTP 。我不能以某种方式从 zip 中读取一些字节,告诉我哪个是第一个条目。
  • 当您声明 ZIP 目录位于存档的最末尾时,如果不阅读它之前的所有内容,您将无法阅读它。这肯定很明显吗?
  • @user207421 这是一个 ftp 服务器,其中包含许多 .zip folders 每个 .zip 文件夹都包含一些 .txt 文件。我想从 ftp 服务器的第一个 .zip 文件夹中读取第一个条目,而不需要下载它。我在下面发布了关于我如何做到这一点的答案。你能告诉我我的解决方案是否适用于非常大的文件吗?

标签: java zip ftp-client


【解决方案1】:

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


输入示例(“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();               
    }                                                                                                                                        

}   

【讨论】:

    猜你喜欢
    • 2019-04-08
    • 2015-10-21
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多