Я загружаю zip-файл с FTP-сервера, используя следующий базовый код:
ftpClient.connect(ftpServerUrl, 21); ftpClient.login(ftpUsername, ftpPassword); ftpClient.enterLocalPassiveMode(); ftpClient.changeWorkingDirectory(ftpFolderPath); for (FTPFile ftpFile : ftpClient.listFiles()) { если (ftpFile.isFile()) { Строка RemoteFilePath = ftpFolderPath + ftpFile.getName(); Строка tempFilePath = ftpDownloadPath + ftpFile.getName(); // Загрузка файла FileOutputStream fos = новый FileOutputStream (tempFilePath); ftpClient.retrieveFile(remoteFilePath, fos); фос.закрыть(); } } Я вижу, что иногда, учитывая один и тот же удаленный файл, он загружает его с разным размером «байт»:

Этот аспект позже (с расшифровкой его содержимого) приводит к тому, что весь процесс разархивирования/дешифрования на моей стороне происходит с ошибкой.
Я могу открыть его с помощью 7zip, но фактически не могу извлечь данные ни с помощью 7zip.
Почему это? И как мне каждый раз скачивать "один и тот же файл"? Странно то, что «иногда» работает, иногда нет. Обратите внимание, что удаленный файл остается нетронутым...
Если я использую:
ftpClient.setFileType(FTP.BINARY_FILE_TYPE) при разархивировании всегда происходит сбой, что выполняется этой функцией:
private static void unzip(String zipFilePath, String destDirectory) выдает IOException { Файл destDir = новый файл (destDirectory); если (!destDir.exists()) { если (!destDir.mkdir()) { возвращаться; } } буфер байт[] = новый байт[1024]; ZipInputStream zipInputStream = новый ZipInputStream(Files.newInputStream(Paths.get(zipFilePath))); Запись ZipEntry = zipInputStream.getNextEntry(); в то время как (запись != ноль) { Строка fileName = вход.getName(); Файл newFile = новый файл (destDirectory + File.separator + имя_файла); Родительский файл = новый файл(Objects.requireNonNull(newFile.getParent())); если (!parent.exists()) { логическое значение создано = родительский.mkdirs(); если (!создано) { throw new IOException("Не удалось создать каталог: " +parent.getAbsolutePath()); } } FileOutputStream fos = новый FileOutputStream (newFile); интервал Лен; while ((len = zipInputStream.read(buffer)) > 0) { fos.write(буфер, 0, длина); } фос.закрыть(); запись = zipInputStream.getNextEntry(); } zipInputStream.closeEntry(); zipInputStream.close(); } Примечание: похоже, что поврежденный файл имеет размер 83,873 байта (на 5 меньше правильного).
Мобильная версия