еще и коментарии ментора
Используй имя архива для создания потока вывода. Затем создай ZipOutputStream и передай в конструктор созданный поток вывода.
package com.javarush.task.task31.task3105;
import java.io.*;
import java.nio.file.Files;
import java.util.HashMap;
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 {
if ( args.length>=2 ) {
HashMap<ZipEntry,ByteArrayOutputStream> listZipEntry = new HashMap<>();
ZipEntry zipEntry;
int length;
//-- Читаем архив в HashMap
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(args[1]));
while ( (zipEntry=zipInputStream.getNextEntry())!=null ) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] arrBytes = new byte[32768];
while ( (length=zipInputStream.read(arrBytes))>=0 )
byteArrayOutputStream.write(arrBytes,0,length);
listZipEntry.put(zipEntry,byteArrayOutputStream);
zipInputStream.closeEntry();
}
zipInputStream.close();
//--- имена
File fileNameAdded = new File(args[0]);
String fileNameSave = "new/"+fileNameAdded.getName();
//--- архив для записи
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(args[1]));
//--- запись добавляемого файла
zipOutputStream.putNextEntry(new ZipEntry(fileNameSave));
Files.copy(fileNameAdded.toPath(), zipOutputStream);
zipOutputStream.closeEntry();
//--- запись сохраненых файлов, кроме дубликата
for (HashMap.Entry<ZipEntry,ByteArrayOutputStream> entry : listZipEntry.entrySet())
if ( entry.getKey().getName().compareToIgnoreCase(fileNameSave)!=0 ) {
zipOutputStream.putNextEntry(new ZipEntry(entry.getKey().getName()));
zipOutputStream.write(entry.getValue().toByteArray());
zipOutputStream.closeEntry();
}
zipOutputStream.close();
}
}
}