Есть несколько вопросов по задаче 1) Почему решение верное, если находящийся внутри архива файл не заменяется, а пропускается, исходя из этого кода
if (!entry.toString().endsWith(fileName)){
                    zout.putNextEntry(entry);
                    zout.write(pair.getValue().toByteArray());
                    zout.closeEntry();
2) Нет ли какого-то более легкого пути, без копирования архива в мапу, и потом записывать это все обратно, а просто как-то напрямую?
public static void main(String[] args) throws IOException {
        Map<String,ByteArrayOutputStream> map = new HashMap<>();
        try(ZipInputStream zin = new ZipInputStream(new FileInputStream(args[1]))) {
            ZipEntry ze;
            while ((ze = zin.getNextEntry()) != null) {
                int count = 0;
                ByteArrayOutputStream by = new ByteArrayOutputStream();
                byte[] buff = new byte[1024];
                while ((count = zin.read(buff)) != -1) {
                    by.write(buff, 0, count);
                }
                map.put(ze.toString(), by);
                zin.closeEntry();
            }
        }
        try(ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(args[1]))){

            String fileName = args[0].substring(args[0].lastIndexOf('/')+1);
            ZipEntry entry = new ZipEntry("new/" + fileName);
            zout.putNextEntry(entry);
            Files.copy(Paths.get(args[0]), zout);
            zout.closeEntry();
            for (Map.Entry<String, ByteArrayOutputStream> pair : map.entrySet()){
                entry = new ZipEntry(pair.getKey());
                if (!entry.toString().endsWith(fileName)){
                    zout.putNextEntry(entry);
                    zout.write(pair.getValue().toByteArray());
                    zout.closeEntry();
                }
            }
        }
    }