Чувствую, что глаз уже "замыленный". Прошу посмотреть знатоков на мой код свежим незамутненным взглядом. Или может кто вспомнит детали позиции валидатора по это задачи после своих мучений. Большую часть вопросов по этой задачи я прочитал, так же как и основную ветку обсуждения, но результата не дало.
package com.javarush.task.task31.task3105;
import java.io.*;
import java.nio.charset.Charset;
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 {
Map<String, ByteArrayOutputStream> content = new HashMap<>();
Path srcPath = Paths.get(args[0]);
String target = "new" + File.separator + srcPath.getFileName().toString();
boolean exchange = false;
try (
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(args[1])));) {
// здесь читаем все в map<>
// и сразу после полной вычитки архива в оперативную памать происходит автоматическое закрытие zis, но валидатор его не видит
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[8192];
int count;
while ((count = zis.read(buf)) != -1) {
baos.write(buf, 0, count);
}
// эти два комментария были для того что бы проверить существование только такого же файла в папке new/ архива
if (!exchange && Paths.get(ze.getName()).getFileName().toString().equals(srcPath.getFileName().toString())) {
// if (!exchange && Paths.get(ze.getName()).toString().equals(target)) {
target = ze.getName();
exchange = true;
continue;
}
content.put(ze.getName(), baos);
zis.closeEntry();
// baos.reset();
// baos.close();
}
// вот здесь происходит автоматическое закрытие всех потоков чтения, но валидатор этого не видит
}
try (
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(args[1])));) {
zos.putNextEntry(new ZipEntry(target));
// для добавление файа используется Files.copy, но валидатор его не видит
Files.copy(Paths.get(args[0]), zos);
zos.closeEntry();
for (Map.Entry<String, ByteArrayOutputStream> elem : content.entrySet()) {
// здесь возвращаем старые файлы в архив
zos.putNextEntry(new ZipEntry(elem.getKey()));
elem.getValue().writeTo(zos);
zos.closeEntry();
}
// вот здесь происходит автоматическое закрытие всех потоков записи, но валидатор их не видит
}
}
}