Перезаписал обращение.
Изменил чтение из архива с побайтного на буффер.
Стало лучше, но один пункт не проходит.
package com.javarush.task.task31.task3105;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
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 {
// Алгоритм
// 1. Считываем все ентри в мапу (имя, байты)
//2. Записываем ентри с проверкой
// если имя текущего ентри совпадает с именем в args[0] то заменяем его Files.copy
// иначе продолжаем добавлять
// если совпадения не было флаг match в false то добавляем файл из args[0] в папку new
Map<String, byte[]> allFiles = new HashMap<>();
String sourceFile = args[0]; //args[0]; // "C:\\Users\\Валентин\\Desktop\\test.txt";
String nameZip = args[1]; //args[1]; //"C:\\Users\\Валентин\\Desktop\\archiv.zip";
String NewNameZip = nameZip; // nameZip; //"C:\\Users\\Валентин\\Desktop\\NewArchiv.zip";
try(FileInputStream fin = new FileInputStream(nameZip);
ZipInputStream zis = new ZipInputStream(fin)
){
ZipEntry zipEntry;
while ((zipEntry = zis.getNextEntry()) != null){
String nameFileInZip = zipEntry.getName();
//System.out.printf("Считываем файл с именем %s из архива.\n", nameFileInZip);
byte[] buffer = new byte[zis.available()];
zis.read(buffer);
allFiles.put(nameFileInZip, buffer);
//System.out.printf("Файл с именем %s добавлен в Мапу.\n", nameFileInZip);
zis.closeEntry();
//System.out.printf("Поток для файла с именем %s закрыт.\n", nameFileInZip);
//baos.close();
//System.out.println("Поток баос закрыт\n");
}
//zis.close();
//System.out.println("Поток зип инпутстрим закрыт");
}
try(ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(NewNameZip));
//System.out.printf("Создаем архив файл с именем %s из архива.\n", NewNameZip);
){
boolean match = false;
ZipEntry zipEntry1;
for (Map.Entry<String,byte[]> pair: allFiles.entrySet()){
String nameFileOut = pair.getKey();
zipEntry1 = new ZipEntry(nameFileOut);
zos.putNextEntry(zipEntry1);
if (sourceFile.endsWith(nameFileOut)){ // если в архиве есть файл с именем файла источника то копируем его
match = true;
Files.copy(Paths.get(sourceFile), zos);
zos.closeEntry();
//System.out.printf("Заменяем файл с именем %s в архиве.\n", nameFileOut);
} else {
zos.write(pair.getValue());
zos.closeEntry();
//System.out.printf("Добавляем файл с именем %s в архив.\n", nameFileOut);
}
}
if (!match){
String nameFileInNewFolder = ("new\\" + Paths.get(sourceFile).getFileName().toString());
//System.out.printf("Добавляем файл с именем %s в архив.\n", nameFileInNewFolder);
zipEntry1 = new ZipEntry(nameFileInNewFolder);
zos.putNextEntry(zipEntry1);
Files.copy(Paths.get(sourceFile), zos);
zos.closeEntry();
}
//zos.close();
//System.out.println("Закрываем поток архива");
}
}
}