Прикрепил код готового решения. Что здесь на самом деле происходит? Как я понял, то новый архив не создаётся, а просто в старый добавляется файл и то ли перезаписывается старые, то ли дублируются. Объясните пожалуйста public class Solution { public static void main(String[] args) throws IOException { List<Content> entries = getContents(args[1]); FileOutputStream zipFile = new FileOutputStream(args[1]); ZipOutputStream zip = new ZipOutputStream(zipFile); //кладем в него ZipEntry –«архивный объект» File file = new File(args[0]); zip.putNextEntry(new ZipEntry("new/" + file.getName())); //копируем файл «document-for-archive.txt» в архив под именем «document.txt» Files.copy(file.toPath(), zip); //копируем все остальные файлы for (Content content : entries) { if (!content.getFileName().equals("new/" + file.getName())) content.saveToZip(zip); } // закрываем архив zip.close(); } private static List<Content> getContents(String arg) throws IOException { List<Content> entries = new ArrayList<>(); try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(arg))) { ZipEntry currentEntry; byte[] buffer = new byte[1024]; while ((currentEntry = zipInputStream.getNextEntry()) != null) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int length = 0; while ((length = zipInputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } entries.add(new Content(currentEntry.getName(), outputStream.toByteArray())); } } return entries; } static class Content { String fileName; byte[] body; Content(String fileName, byte[] body) { this.fileName = fileName; this.body = body; } public String getFileName() { return fileName; } void saveToZip(ZipOutputStream zip) throws IOException { ZipEntry zipEntry = new ZipEntry(fileName); zip.putNextEntry(zipEntry); zip.write(body); zip.closeEntry(); } } }