траухажуюсь.
код полностью рабочий.
- не использует файловую систему
- в случае, если файл имя файла совпадает с именем файла в папке new - файл заменяется, в случае если файла с таким именем нет - новый файл добавляется
посмотрел комменты, решение не смотрел.
у меня вопрос, неужели валидатору не нарвится мой класс Pair и он категорически желает видеть мапу?
или у меня есть ошибки в коде?
PS то, что окошечный архиватор создаёт битые архивы - я понял, написал класс, который создаёт и заполняет тестовый вариант архива. приложу ее ниже
package com.javarush.task.task31.task3105;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/*
Добавление файла в архив
*/
public class Solution {
private static final List<Pair> savedEntries = new ArrayList<>();
public static void main(String[] args) throws IOException {
Path fileName = Paths.get(args[0]);
Path oldZipArchive = Paths.get(args[1]);
String newDerictoryInArchive = "new/";
String absolutePathOfResultFile = newDerictoryInArchive + fileName.getFileName();
FileInputStream fis = new FileInputStream(fileName.toFile());
boolean flag = false;
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(oldZipArchive.toFile()))) {
ZipEntry currentEntry = null;
int currentByte = 0;
Pair pair = null;
while ((currentEntry = zis.getNextEntry()) != null) {
List<Integer> currentContent = new ArrayList<>();
if (!currentEntry.isDirectory()) {
if (currentEntry.getName().equals(absolutePathOfResultFile)) {
while ((currentByte = fis.read()) != -1) currentContent.add(currentByte);
flag = true;
} else {
while ((currentByte = zis.read()) != -1) currentContent.add(currentByte);
}
}
pair = new Pair(currentEntry.getName(), currentEntry.isDirectory() ? null : currentContent);
savedEntries.add(pair);
zis.closeEntry();
}
}
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(oldZipArchive.toFile()))) {
for(Pair entry : savedEntries) {
zos.putNextEntry(new ZipEntry(entry.getZipEntryName()));
if (entry.getEntryContent() != null) {
for (Integer currentByte : entry.getEntryContent()) {
if (currentByte < 0 || currentByte > 255) {
throw new IllegalArgumentException("Element is not a byte value");
}
zos.write(currentByte);
}
}
}
if(!flag) {
zos.putNextEntry(new ZipEntry(absolutePathOfResultFile));
int currentByte = 0;
while ((currentByte = fis.read()) != -1) {
zos.write(currentByte);
}
zos.closeEntry();
}
}
}
}