Добрый день!
Я решила задачу, но мне бы хотелось разобраться, почему валидатор не принял решение ниже:
public static void main(String[] args) throws IOException { //В метод main приходит список аргументов.
Map<ZipEntry, ByteArrayOutputStream> zipEntryMap = new HashMap<>();
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(args[1]))) {
ZipEntry entry;
while ((entry = zipInputStream.getNextEntry()) != null) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len;
byte[] buffer = new byte[1024];
while ((len = zipInputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
zipEntryMap.put(entry, outputStream);
}
}
try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(args[1]))) {
File file = new File(args[0]);
ZipEntry newEntry = new ZipEntry("new/" + file.getName());
zipOutputStream.putNextEntry(newEntry);
Files.copy(file.toPath(), zipOutputStream);
zipEntryMap.forEach((e, b) -> {
if (!e.getName().equals("new/" + file.getName()))
try {
ZipEntry zipEntry = new ZipEntry(e);
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.write(b.toByteArray());
zipOutputStream.closeEntry();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
});
}
}
Валидатор не пропускает по проверке "В ZipOutputStream нужно записать все остальное содержимое, которое было вычитано из ZipInputStream", то есть он видит проблему от 27 сроки, где имя entry сравнивается.
Если в zipEntryMap передать String, т. е. сделать
zipEntryMap.put(entry.getName, outputStream);
и дальше работать со String ( в 27 строке, где сравнение) то валик ругаться перестаёт.
Но какая ему, по сути, разница, на каком этапе я запрашиваю имя entry? Почему это влияет на результат?