public class Solution {
public static void main(String[] args) throws IOException {
// Создаю мапу для временного хранения архива (пробовал вторым аргуметом byte[]) тоже всё работает, но валик не принимает
Map<ZipEntry, ByteArrayOutputStream> map = new HashMap<>();
String inputZip = args[1]; // инициализирую входные имена
String addedFile = args[0];
// Получаю имя файла, который надо добавить
String addedFileName = Paths.get(addedFile).getFileName().toString();
String newAddedFileName = "new/" + addedFileName; // Получаю его новое имя
ZipEntry zipEntry;
// Открываю поток для чтения архива
ZipInputStream zis = new ZipInputStream(new FileInputStream(inputZip));
// Читаю его пока поток не кончится
while ((zipEntry = zis.getNextEntry()) != null) {
// Если новый файл уже есть в архиве - пропускаю его
if (!zipEntry.getName().endsWith(addedFileName)) {
// Создаю поток для временного хранения прочитанных байтов
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int length = 0;
byte[] buffer = new byte[1024];
while ((length = zis.read(buffer)) != -1) { // Заполняю поток байтами
baos.write(buffer, 0, length);
}
map.put(zipEntry, baos);
}
}
zis.close(); // Закрываю поток для чтения архива
// Открываю поток для записи архива
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(inputZip));
Path newFile = Paths.get(addedFile); // Создаю Path для нового файла
// Помещаю в архив этот новый файл и подготавливаю zos для записи в этот файл
zos.putNextEntry(new ZipEntry(newAddedFileName));
Files.copy(newFile, zos); // Записываю в zos новый файл
// Записываю в архив его старые файлы
for (Map.Entry<ZipEntry, ByteArrayOutputStream> pair : map.entrySet()) {
zos.putNextEntry(pair.getKey());
pair.getValue().writeTo(zos);
}
zos.close(); // Закрываю поток для записи архива
}
}
Ну и что я делаю не так? Прошу помочь разобратьсяАлексей Иванов
23 уровень
Валидатор утверждает, что я не всё содержимое исходного архива записываю в файл. Но на тестовых файлах записывается всё. Помогите пожалуйста
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Maris
16 октября 2020, 20:24
Спасибо за такой понятный код! Читается лучше любой местной лекции!
0
Алексей Иванов
21 октября 2020, 08:54
Спасибо за комплимент моему коду
0
Павел Безумный учёный Expert
17 июня 2020, 07:19решение
При попытке добавить в новый архив старую запись ZipEntry генерируется исключение ZipException. Для упаковки файлов в новый архив создайте новые ZipEntry на основе имён прежних записей:
+3
Алексей Иванов
17 июня 2020, 09:09
Спасибо огромное. Получилось. Но почему тогда, когда я тестировал на своём компе это исключение не генерировалось?
0
Павел Безумный учёный Expert
17 июня 2020, 09:46
Возможно, это связано с версией Java. Я проверял на версии 1.8.0_251 (насколько мне известно, на сервере JavaRush также установлена 8 версия).
0
Алексей Иванов
17 июня 2020, 12:28
Видимо так и есть. Я использую 14.0.1. Теперь, наверное, переключусь на 1.8. чтобы проще было с валидатором
0