package com.javarush.task.task31.task3105;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
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<ZipEntry, byte[]> dataFromZip = new HashMap<>();
byte[] buffer = new byte[1024];
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(args[1]))) {
ZipEntry entry;
while ((entry = zipInputStream.getNextEntry()) != null) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int count;
while ((count = zipInputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, count);
}
dataFromZip.put(entry, byteArrayOutputStream.toByteArray());
}
}
FileOutputStream fileOutputStream = new FileOutputStream(args[1]);
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
Path path = Paths.get(args[0]);
List<ZipEntry> zipEntries = new ArrayList<>(dataFromZip.keySet());
boolean isContains = false;
for (ZipEntry zipEntry : zipEntries) {
if (zipEntry.getName().equals(path.getFileName().toString())) {
isContains = true;
}
}
if (isContains) {
try {
zipOutputStream.putNextEntry(new ZipEntry(path.getFileName().toString()));
Files.copy(path, zipOutputStream);
zipOutputStream.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
} else {
try {
zipOutputStream.putNextEntry(new ZipEntry("new/"));
zipOutputStream.putNextEntry(new ZipEntry("new/" + path.getFileName().toString()));
Files.copy(path, zipOutputStream);
zipOutputStream.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
}
dataFromZip.forEach((key, value) -> {
if (!key.getName().equals(path.getFileName().toString())) {
try {
zipOutputStream.putNextEntry(key);
zipOutputStream.write(value);
zipOutputStream.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
}
});
zipOutputStream.close();
}
}
Mykhailo Trunov
41 уровень
валидатор не пропускает
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Roman Java Developer Expert
22 августа 2018, 14:48
Запустил у себя на реальных файлах, получил:
java.util.zip.ZipException: invalid entry compressed size (expected 34564 but got 34575 bytes)
0
Mykhailo Trunov
23 августа 2018, 09:32
спасибо, буду смотреть в чем проблема
0
Roman
5 марта 2019, 14:38
Разобрались в чем проблема ?
0
Mykhailo Trunov
6 марта 2019, 19:44
уже и не помню, за пол года забыл решение (
0
АндрейFull Stack Developer в ИП
16 сентября 2019, 16:27
Он при записи новых/старых файлов в архив использовал новые экземпляры ZipEntry, т.к. у считанных экземпляров кроме имени куча других параметров (например: размер до и после архивации).
0