Добрый день воспользовался рекомендациями что ниже
но все равно не выходит аленький цветочек
Так как в прошлый раз я выпадал в тайм аут
пункт 2 решил проработать
пункт 3 исправил
пункт 1 исправил
пункт 4 исправил
на моих тестовых файлах вроде работает)))
---------------------------------------------------------------
1. Для создания ZipEntry добавляемого файла необходим относительный путь, состоящий из родительского каталога внутри архива и имени добавляемого файла, причём имя должно быть кратким, например:
// Полное имя добавляемого файла в файловой системе:
C:/pathToTest/result.mp3
// Относительный путь к файлу внутри архива:
new/result.mp3
Проверьте путь, получаемый в 41 строке и добавляемый в список list.
2. Для считывания данных из ZipInputStream, а также для чтения содержимого добавляемого файла используйте буферы. Это существенно ускорит работу алгоритма при обработке сравнительно больших файлов (размером в десятки мегабайт). На мой взгляд, причина тайм-аута при валидации - именно в этом.
3. Перед созданием новых ZipEntry и их записью в поток ZipOutputStream убедитесь, что список list не содержит двух одинаковых элементов. Если этого не сделать, то будут созданы два объекта ZipEntry с одинаковыми именами, что приведёт к ошибке во время записи в поток. Вообще говоря, для хранения информации о содержимом архива удобнее было бы использовать Map, где ключами были бы имена внутри архива, а значениями - соответствующие массивы с данными.
4. Для очистки списка f1 лучше воспользоваться методом clear(), специально предназначенным для этого.
package com.javarush.task.task31.task3105;
import java.io.*;
import java.nio.file.Files;
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 {
//args = new String[]{"Q:\\filetest\\lvl31\\c.txt", "Q:\\filetest\\lvl31\\test.zip"};
//args = new String[]{"Q:/filetest/lvl31/c.txt", "Q:/filetest/lvl31/test.zip"};
ArrayList<Byte> f1 = new ArrayList<>();
ArrayList<byte[]> dataFile = new ArrayList<>();
FileInputStream zipFile = new FileInputStream(args[1]);
ZipInputStream zin = new ZipInputStream(zipFile);
BufferedInputStream buffer = new BufferedInputStream(zin);
HashMap<String, ArrayList> allFile = new HashMap<>();
ZipEntry entry;
entry = zin.getNextEntry();
String[] words = args[0].split("/");
int x =1024; // Размер буфера
byte[] dataBytes = new byte[x];
// int control = 0; // контролиурем чтение из файла меньше 1024
// while ((entry = zin.getNextEntry()) != null) { // не работает
while (entry != null) {
int amountData = 0;
while (amountData != -1) {
amountData = buffer.read(dataBytes, 0, x);
if (amountData == x) dataFile.add(dataBytes.clone());
if (amountData < x && amountData>0) {
byte[] dataBytes1023 = new byte[amountData];
for (int i = 0; i < amountData; i++) dataBytes1023[i] = dataBytes[i];
dataFile.add(dataBytes1023.clone());
}
}
allFile.put(entry.getName(), new ArrayList<>(dataFile));
dataFile.clear();
// int amountData = buffer.read(dataBytes, 0, 3);
//
//
// if (amountData < 3) { //????Проверить точно размер файла
// byte[] dataBytes1023 = new byte[amountData];
// for (int i = 0; i < amountData; i++) dataBytes1023[i] = dataBytes[i];
// dataFile.add(dataBytes1023);
// allFile.put(entry.getName(), dataFile);
// }
//
// while (amountData != -1 || amountData == 3) {
// //for (int i = 0; i < 3; i++) if (dataBytes[i] != 0) f1.add(dataBytes[i]);
// dataFile.add(dataBytes);
// amountData = buffer.read(dataBytes, 0, 3);
//
//
// }
entry = zin.getNextEntry();
}
FileInputStream fis = new FileInputStream(args[0]);
BufferedInputStream buffer1 = new BufferedInputStream(new FileInputStream(args[0]));
int amountData = 0;
// while (amountData != -1) {
// amountData = buffer1.read(dataBytes, 0, 3);
// if (amountData < 3 && amountData > -1) { //????Проверить точно размер файла
// byte[] dataBytes1023 = new byte[amountData];
// for (int i = 0; i < amountData; i++) dataBytes1023[i] = dataBytes[i];
// dataFile.add(dataBytes1023);
// allFile.put("new/" + words[words.length - 1], dataFile);
//
// }
//
// while (amountData != -1 || amountData == 3) {
// for (int i = 0; i < 3; i++) if (dataBytes[i] != 0) f1.add(dataBytes[i]);
// amountData = buffer.read(dataBytes, 0, 3);
//
// }
//
// }
while (amountData != -1) {
amountData = buffer1.read(dataBytes, 0, x);
if (amountData == x) dataFile.add(dataBytes.clone());
if (amountData < x && amountData>0) {
byte[] dataBytes1023 = new byte[amountData];
for (int i = 0; i < amountData; i++) dataBytes1023[i] = dataBytes[i];
dataFile.add(dataBytes1023.clone());
}
}
allFile.put("new/" + words[words.length - 1], new ArrayList<>(dataFile));
dataFile.clear();
ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(args[1]));
for (Map.Entry<String, ArrayList> pair : allFile.entrySet()) {
String key = pair.getKey(); //ключ
ArrayList value = pair.getValue(); //значение
entry = new ZipEntry(key);
zout.putNextEntry(entry);
for (int i=0;i<value.size();i++)
zout.write((byte[]) value.get(i));
}
zout.closeEntry();
zout.close();
}
}