Сначала я писал энтри из архива, а потом сам файл - была ошибка про использование Files.copy(), поменял порядок записи в архив: теперь сначала файл из аргумента, потом ентри. Обкатал оба варианта на домашней тачке (с заменой и созданием каталога new) - все работает. Что надо сделать, чтобы наконец сдать эту задачу???
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.ByteBuffer;
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 {
boolean existenceFlag = false;
Path file = Paths.get(args[0]);
String fileName = file.toString().substring(file.toString().lastIndexOf("/") + 1);
Map<String, byte[]> zipEntryMap = new HashMap<>();
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(args[1]))){
ZipEntry entry;
while ((entry = zipInputStream.getNextEntry()) != null) {
if (entry.getName().equals(fileName)) {
continue;
}
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count = 0;
while ((count = zipInputStream.read(buffer)) != -1)
byteArrayOutputStream.write(buffer, 0, count);
zipEntryMap.put(entry.getName(), byteArrayOutputStream.toByteArray());
}
} catch (IOException e) {
e.printStackTrace();
}
try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(args[1]))) {
if (zipEntryMap.containsKey(fileName)) {
zipOutputStream.putNextEntry(new ZipEntry(fileName));
} else {
zipOutputStream.putNextEntry(new ZipEntry("new/" + fileName));
}
Files.copy(file, zipOutputStream);
zipOutputStream.flush();
zipOutputStream.closeEntry();
for (Map.Entry<String, byte[]> mapEntry : zipEntryMap.entrySet()) {
zipOutputStream.putNextEntry(new ZipEntry(mapEntry.getKey()));
zipOutputStream.write(mapEntry.getValue());
zipOutputStream.flush();
zipOutputStream.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}