Создание защищенного паролем zip-файла в формате java, во время распаковки я получаю сообщение о том, что файл не поддерживается - PullRequest
0 голосов
/ 06 августа 2020

Я могу создать zip-файл, мое требование - защитить его паролем. Для этого я использую библиотеку zip4j. Для справки нажмите следующую ссылку. [https://github.com/srikanth-lingala/zip4j]

Ниже это код.

 public static void packZip(File output, List<File> sources) throws IOException {
System.out.println("Packaging to " + output.getName());
ZipOutputStream zipOut = initializeZipOutputStream(output, "password".toCharArray());
    

for (File source : sources) {
  if (source.isDirectory()) {
    zipDir(zipOut, "", source);
  } else {
    zipFile(zipOut, "", source);
  }
}
zipOut.flush();
zipOut.close();
System.out.println("Done");

}

private static void zipFile(ZipOutputStream zos, String path, File file) throws IOException {
if (!file.canRead()) {
  return;
}
ZipParameters zipParameters = new ZipParameters();
zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
zipParameters.setCompressionLevel(CompressionLevel.NORMAL);
zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);
zipParameters.setFileNameInZip(buildPath(path,file.getName()));
zos.putNextEntry(zipParameters);

FileInputStream fis = new FileInputStream(file);

byte[] buffer = new byte[4092];
int byteCount = 0;
while ((byteCount = fis.read(buffer)) != -1) {
  zos.write(buffer, 0, byteCount);
}
ZipFile zipFile = new ZipFile(file, "password".toCharArray());
zipFile.addFile(file, zipParameters);
//zipFile.createSplitZipFileFromFolder(file, zipParameters, true, 10485760);

fis.close();
zos.closeEntry();

}

private static ZipOutputStream initializeZipOutputStream(File outputZipFile, char[] password)
  throws IOException {

FileOutputStream fos = new FileOutputStream(outputZipFile);

return new ZipOutputStream(fos, password);

}

private static void zipDir(ZipOutputStream zos, String path, File dir) throws IOException {
if (!dir.canRead()) {
  return;
}

File[] files = dir.listFiles();
path = buildPath(path, dir.getName());
for (File source : files) {
  if (source.isDirectory()) {
    zipDir(zos, path, source);
  } else {
    zipFile(zos, path, source);
  }
}

}

Когда я использую класс ZipFile для защиты паролем, я не могу извлечь zip-файл, во время извлечения он меняется с .zip на формат String. Если я использую класс ZipOutputStream для защиты паролем, во время извлечения формат файла не меняется, но он не запрашивает пароль, как ожидалось. Любая помощь приветствуется, заранее спасибо.

...