Есть несколько вопросов по задаче
1) Почему решение верное, если находящийся внутри архива файл не заменяется, а пропускается, исходя из этого кода
if (!entry.toString().endsWith(fileName)){
zout.putNextEntry(entry);
zout.write(pair.getValue().toByteArray());
zout.closeEntry();
2) Нет ли какого-то более легкого пути, без копирования архива в мапу, и потом записывать это все обратно, а просто как-то напрямую?
public static void main(String[] args) throws IOException {
Map<String,ByteArrayOutputStream> map = new HashMap<>();
try(ZipInputStream zin = new ZipInputStream(new FileInputStream(args[1]))) {
ZipEntry ze;
while ((ze = zin.getNextEntry()) != null) {
int count = 0;
ByteArrayOutputStream by = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
while ((count = zin.read(buff)) != -1) {
by.write(buff, 0, count);
}
map.put(ze.toString(), by);
zin.closeEntry();
}
}
try(ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(args[1]))){
String fileName = args[0].substring(args[0].lastIndexOf('/')+1);
ZipEntry entry = new ZipEntry("new/" + fileName);
zout.putNextEntry(entry);
Files.copy(Paths.get(args[0]), zout);
zout.closeEntry();
for (Map.Entry<String, ByteArrayOutputStream> pair : map.entrySet()){
entry = new ZipEntry(pair.getKey());
if (!entry.toString().endsWith(fileName)){
zout.putNextEntry(entry);
zout.write(pair.getValue().toByteArray());
zout.closeEntry();
}
}
}
}