Используй имя архива для создания потока вывода. Затем создай ZipOutputStream и передай в конструктор созданный поток вывода.
Для записи файла в поток архива используй метод Files.copy(Path, OutputStream).
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.HashMap;
import java.util.Map;
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 {
//Создаем map, где ключ это имя заархивированного файла в архиве, а значение
//это путь к временному файлу, в который мы копируем заархивированный файл
Map<String, Path> listTempFiles = new HashMap<>();
//Далее разархивируем zip архив, достаем из него текущие файлы и сохраняем их
//во временные файлы. Сохраняем в Map исходное имя каждого файла и путь к временному
//файлу, который является копией этого файла. Его мы и будем потом копировать
// новый zip архив
try (ZipInputStream zIS = new ZipInputStream(new FileInputStream(args[1]))) {
ZipEntry zentry;
byte[] buffer;
int byteSize;
while ((zentry = zIS.getNextEntry()) != null) {
buffer = new byte[4096];
Path tempFile = Files.createTempFile("", "");
listTempFiles.put(zentry.getName(), tempFile);
while ((byteSize = zIS.read(buffer)) > 0) {
try (FileOutputStream fOS = new FileOutputStream(tempFile.toString())) {
fOS.write(buffer, 0, byteSize);
}
}
}
}
//Получаем путь к новому файлу, который будем добавлять в архив
Path fileName = Paths.get(args[0]);
//Получаем структуру папок, где будет размещен новый файл
Path pathToZip = Paths.get("new" + "\\" + fileName.getFileName());
//Копируем новый в архив в папку согласно условию задачи
try (ZipOutputStream zOS = new ZipOutputStream(new FileOutputStream(args[1]))) {
zOS.putNextEntry(new ZipEntry(pathToZip.toString()));
Files.copy(Paths.get(args[0]), zOS);
//Проходимся по Map и добавляем в архив все файлы, который были в архиве изначально
for (String key : listTempFiles.keySet()) {
zOS.putNextEntry(new ZipEntry(key));
Files.copy(listTempFiles.get(key), zOS);
}
}
}
}