Тут было неуместно саркастически-агрессивное замечание в адрес валидатора.
Я был не прав.
public class Solution {
public static void main(String[] args) throws IOException {
\\ получаем пути архива и добавляемого файла из параметров
Path file = Paths.get(args[0]);
Path zipFile = Paths.get(args[1]);
\\ создаем map<имя файла, содержимое> для хранения файлов архива и копируем их
HashMap<String, byte[]> map = new HashMap<>();
try (ZipInputStream inputStream = new ZipInputStream(Files.newInputStream(zipFile))) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ZipEntry entry = inputStream.getNextEntry();
while (entry != null) {
byte[] buffer = new byte[8 * 1024];
int len;
while ((len = inputStream.read(buffer)) > 0)
byteArrayOutputStream.write(buffer, 0, len);
map.put(entry.getName(), byteArrayOutputStream.toByteArray());
inputStream.closeEntry();
entry = inputStream.getNextEntry();
}
}
try (ZipOutputStream outputStream = new ZipOutputStream(Files.newOutputStream(zipFile))) {
\\ создаем переменную, которая будет подтверждать необходимость записи файла в папку "new"
boolean flag = true;
\\ записываем содержимое map в архив на месте предыдущего
\\ параллельно проверяем совпадение имени добавляемого файла с файлами архива
for (Map.Entry<String, byte[]> mapEntry : map.entrySet()) {
outputStream.putNextEntry(new ZipEntry(mapEntry.getKey()));
\\ при совпадении имен перезаписываем файл архива
if (Paths.get(mapEntry.getKey()).getFileName().equals(file.getFileName())) {
Files.copy(file.toAbsolutePath(), outputStream);
flag = false;
} else {
outputStream.write(mapEntry.getValue());
}
outputStream.closeEntry();
}
\\ если совпадений не было, то дописываем новый файл в "new"
if (flag) {
outputStream.putNextEntry(new ZipEntry("new\\" + file.getFileName()));
Files.copy(file.toAbsolutePath(), outputStream);
outputStream.closeEntry();
}
}
}
}