Получите имя первой записи ZIP с удаленного FTP-сервера, не загружая zip с помощью Java 8+ - PullRequest
0 голосов
/ 11 июля 2019

Я использую FTPClient для загрузки файлов с моего FTP-сервера, он полон zip-папок, которые содержат от одного до многих .txt файлов внутри.Они могут быть огромными по размеру, например ... 10 ГБ.

Что я хочу сделать, это без загрузки zip-архива с FTP , прочитайте имя первого .txt файла, который у него есть.Гарантируется, что в нем будет как минимум 1 .txt файл.

Я прочитал очень интересную статью здесь , но она в .NET, и они используют удаленный URL, который отличается отмоя ситуация.


Формат zip определяет какой-то каталог, указывающий на все его внутренние записи.Содержит свойства, такие как имена, начальное смещение, размер и другие вещи.И этот каталог довольно маленький, всего несколько байтов, размещенных в самом конце архива.

enter image description here

Как я могу поиграть с ним с помощью FTPCient

1 Ответ

0 голосов
/ 11 июля 2019

Я сделал следующее, насколько я вижу, другого ответа нет.


Пример imput ( "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();               
    }                                                                                                                                        

}   
...