Вот этот код корректно работает и при распаковке архива сохраняет структуру папок внутри архива, но его не принимает валидатор.
public void extractAll(Path outputFolder) throws Exception {
if (!Files.isRegularFile(zipFile))
throw new WrongZipFileException();
if (!Files.isRegularFile(outputFolder))
Files.createDirectories(outputFolder);
try (ZipInputStream zis = new ZipInputStream(Files.newInputStream(zipFile))) {
ZipEntry archiveElement;
while ((archiveElement = zis.getNextEntry()) != null) {
Path filePath = outputFolder.resolve(archiveElement.getName());
if (archiveElement.isDirectory()) Files.createDirectories(filePath);
else {
try (OutputStream fos = Files.newOutputStream(filePath)) {
copyData(zis, fos);
}
}
}
}
}
Кое-как решив задачу (угодив валидатору) я перешёл к 16 части и решил посмотреть, какой код является корректным с точки зрения разработчиков и валидатора (код обновился после загрузки 16 задания). Так вот я увидел вот этот код:
public void extractAll(Path outputFolder) throws Exception {
// Проверяем существует ли zip файл
if (!Files.isRegularFile(zipFile)) {
throw new WrongZipFileException();
}
try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipFile))) {
// Создаем директорию вывода, если она не существует
if (Files.notExists(outputFolder))
Files.createDirectories(outputFolder);
// Проходимся по содержимому zip потока (файла)
ZipEntry zipEntry = zipInputStream.getNextEntry();
while (zipEntry != null) {
String fileName = zipEntry.getName();
Path fileFullName = outputFolder.resolve(fileName);
// Создаем необходимые директории
Path parent = fileFullName.getParent();
if (Files.notExists(parent))
Files.createDirectories(parent);
try (OutputStream outputStream = Files.newOutputStream(fileFullName)) {
copyData(zipInputStream, outputStream);
}
zipEntry = zipInputStream.getNextEntry();
}
}
}
Данный код принимается валидатором, но не работает! По сути он просто выдаёт ошибку и не даёт распаковать архив в отличии от моего кода. Я тестировал на архиве со вложенными папками, может быть на архивах без папок, в которых только файлы, он будет работать корректно, но такой код всё равно не считается рабочим!
Собственно, это вопрос к разработчикам.