Рекомендации "от ментора" (в порядке ошибок которые выдал валидатор):
1. Для записи файла в поток архива используй метод Files.copy(Path, OutputStream).
Так и делаю для нового файла, строка 47
2. Убедись, что содержимое результирующего архива соответствует заданию.
Запускал несколько раз. Создается архив с исходными файлами и добавляется заменяется новый.
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 {
if (args.length < 2) return;
Path zipFile = Paths.get(args[1]);
Map<ZipEntry, ByteArrayOutputStream> filesData = new HashMap<>();
try (
ZipInputStream zipInStream = new ZipInputStream(Files.newInputStream(zipFile))
) {
generateZipEntryMap(zipInStream, filesData);
}
try(
ZipOutputStream zip = new ZipOutputStream(Files.newOutputStream(zipFile))
) {
createZipFromMap(filesData, zip, Paths.get(args[0]));
zip.flush();
}
}
private static void createZipFromMap(Map<ZipEntry, ByteArrayOutputStream> filesData, ZipOutputStream zip, Path newFile) throws IOException {
String newFileName = newFile.getFileName().toString();
for (Map.Entry<ZipEntry, ByteArrayOutputStream> entry : filesData.entrySet()) {
if (!entry.getKey().getName().equals("new/" + newFileName)) {
zip.putNextEntry(entry.getKey());
copy(new ByteArrayInputStream(entry.getValue().toByteArray()), zip);
}
}
ZipEntry newEntry = new ZipEntry("new/" + newFileName);
zip.putNextEntry(newEntry);
Files.copy(newFile, zip);
}
private static void generateZipEntryMap(ZipInputStream zipInStream, Map<ZipEntry, ByteArrayOutputStream> filesData) throws IOException {
for (ZipEntry entry = zipInStream.getNextEntry(); entry != null; entry = zipInStream.getNextEntry()) {
ByteArrayOutputStream fileData = new ByteArrayOutputStream();
copy(zipInStream, fileData);
filesData.put(entry, fileData);
}
}
private static void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[4 * 1024];
int count = 0;
while ((count = in.read(buffer)) != -1) {
out.write(buffer, 0, count);
}
}
}