Не поверите, но вот первый раз столкнулся с тем, что валидатор решил не принимать мое рабочее решение.
Суть в том, что я решил использовать ТОЛЬКО те методы, которые были изучены ранее, в результате у меня получился следующий код, что собирает единый файл из частей, лежащих в архиве. НО, валидатор ни по одному пункту, конечно же, не пускает.
Что я упустил или не понял?
package com.javarush.task.task31.task3106;
import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/*
Разархивируем файл
*/
public class Solution {
public static void main(String[] args) throws IOException {
Path archivePath = Paths.get(args[1].substring(0, args[1].lastIndexOf('.')));
FileOutputStream fos = new FileOutputStream(args[0], true);
FileInputStream fis = new FileInputStream(archivePath.toString());
ZipInputStream zis = new ZipInputStream(fis);
ArrayList entryNames = new ArrayList();
for (int i = 1; i < args.length; i++) {
entryNames.add(args[i].substring(args[i].lastIndexOf('.') + 1));
}
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
if (entryNames.contains(entry.getName().substring(0, entry.getName().lastIndexOf('.')))) {
byte[] buffer = new byte[(int) entry.getSize()];
zis.read(buffer);
fos.write(buffer);
}
zis.closeEntry();
}
zis.close();
fis.close();
fos.close();
/*
Path resultFileName = Paths.get(args[0]); //путь файла-результата
Map<ZipEntry, byte[]> zipEntries = new LinkedHashMap<>(); //коллекция в которой будем хранить файлы архива
InputStream in = new FileInputStream(args[1]); //Открываем входящий поток
ZipInputStream zis = new ZipInputStream(in); //Открываем входящий zip-поток
ZipEntry ze = zis.getNextEntry();
findFiles(ze, zipEntries, zis); //собираем в коллекции файлы архива
zis.closeEntry();
zis.close(); //Закрываем входящий поток
in.close(); //Закрываем входящий zip-поток
}
//Метод для перебора файлов архива
public static void findFiles(ZipEntry ze, Map<ZipEntry, byte[]> zipEntries, ZipInputStream zis) throws IOException {
while (ze != null){
ByteArrayOutputStream baos = new ByteArrayOutputStream(); //Временное хранилище содержимого ZipEntry
copyData(zis, baos); //Читаем ZipEntry во временное хранилище
byte[] b = baos.toByteArray();
zipEntries.put(ze, b); //записываем файл
zis.closeEntry();
ze = zis.getNextEntry();
}
}
//Метод для чтения ZipEntry
public static void copyData(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[8 * 1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
*/
}
}