Вариант номер 2) у меня работает как нужно. Валя выдаёт Тайм аут.
package com.javarush.task.task31.task3105;
import java.awt.*;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.List;
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 {
Path pathArh = Paths.get(args[1]);
Path pathFileForAdd = Paths.get(args[0]);
InputStream inputStream;
ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(pathArh));
Map<String, byte[]> nameEndData = new HashMap<>();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.getNextEntry()) != null){
if(!zipEntry.getName().equals("new/" + pathFileForAdd.getFileName())) {
int readByte;
while (zipInputStream.available() > 0) {
readByte = zipInputStream.read();
byteArrayOutputStream.write(readByte);
}
nameEndData.put(zipEntry.getName(), byteArrayOutputStream.toByteArray());
}
}
zipInputStream.close();
ZipOutputStream zipOutputStream = new ZipOutputStream(Files.newOutputStream(pathArh));
for(String entryName: nameEndData.keySet()){
zipOutputStream.putNextEntry(new ZipEntry(entryName));
zipOutputStream.write(nameEndData.get(entryName));
zipOutputStream.closeEntry();
}
zipOutputStream.putNextEntry(new ZipEntry("new/" + pathFileForAdd.getFileName()));
inputStream = Files.newInputStream(pathFileForAdd);
while (inputStream.available() > 0){
zipOutputStream.write(inputStream.read());
}
zipOutputStream.close();
inputStream.close();
}
}