Может у кого будут идеи.
По факту у меня есть только сомнения в правильности интерпретации след. условия:
Если в архиве есть файл с таким именем, то заменить его.
//Если файл такой уже был в архиве переписываем его
//Из мапы грохаем запись о файле, который переписали
//А если нет, то записывает в этот архив но с директорией "new"
Но может я еще где-то с архивацией напортачил... вроде не очень сложно все...
package com.javarush.task.task31.task3105;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/*
Добавление файла в архив
*/
public class Solution {
public static void main(String[] args) throws IOException {
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(args[1]));){
//zipInputStream.read(new byte[4],0,1); //для локальных тестов
Map<ZipEntry, ByteArrayOutputStream> map = new HashMap<>();
ZipEntry buffer;
//аписывает zip архив в мапу
while ((buffer = zipInputStream.getNextEntry()) != null) {
byte[] bytes = new byte[zipInputStream.available()];
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byteArrayOutputStream.write(zipInputStream.read(bytes));
map.put(buffer, byteArrayOutputStream);
}
//Создаем зипсущность под новый файл
Path path = Paths.get(args[0]);
ZipEntry zipEntry = new ZipEntry(path.getFileName().toString());
//Начинаем запись в новый архив
try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(args[1]));) {
//Если файл такой уже был в архиве переписываем его
//Из мапы грохаем запись о файле, который переписали
//А если нет, то записывает в этот архив но с директорией "new"
if (map.containsKey(zipEntry)) {
zipOutputStream.putNextEntry(zipEntry);
Files.copy(Paths.get(args[0]), zipOutputStream);
map.remove(zipEntry);
} else {
String newFileNameWithDirectory = "new" + File.separator + path.getFileName().toString();
zipEntry = new ZipEntry(newFileNameWithDirectory);
zipOutputStream.putNextEntry(zipEntry);
Files.copy(Paths.get(args[0]), zipOutputStream);
}
//Пишем все имеющиеся рание в архиве файлы в архив
for (Map.Entry<ZipEntry, ByteArrayOutputStream> current : map.entrySet()) {
zipOutputStream.putNextEntry(current.getKey());
zipOutputStream.write(current.getValue().toByteArray());
zipOutputStream.closeEntry();
}
}
catch (IOException e) {e.printStackTrace();}
}
catch (IOException e) {e.printStackTrace();}
}
}