Подскажите, пожалуйста! Результат в обоих вариантах правильный, но валидатор валит по всем пунктам. Что не так? Я уже два дня потратил на эту задачу:(
package com.javarush.task.task31.task3105;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/*Second solution.
Was not accepted by the validator*/
public class Solution {
public static void main(String[] args) throws IOException {
File fileToArchive = new File(args[0]);
File archive = new File(args[1]);
//В методе main создай ZipInputStream для архивного файла (второй аргумент main). Нужно вычитать из него все содержимое.
//Используй имя архива для создания потока ввода. Затем создай ZipInputStream и передай в конструктор созданный поток ввода.
ZipInputStream zis = new ZipInputStream(new FileInputStream(archive));
List<File> oldFiles = new ArrayList<>();
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
File file = new File(zipEntry.getName());
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int length;
while ((length = zis.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, length);
}
oldFiles.add(file);
zipEntry = zis.getNextEntry();
}
zis.close();
//В методе main создай ZipOutputStream для архивного файла (второй аргумент main).
//Используй имя архива для создания потока вывода. Затем создай ZipOutputStream и передай в конструктор созданный поток вывода.
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(archive));
//В ZipOutputStream нужно записать содержимое файла, который приходит первым аргументом в main.
//Для записи файла в поток архива используй метод Files.copy(Path, OutputStream).
zos.putNextEntry(new ZipEntry("new/"));
zos.putNextEntry(new ZipEntry("new/" + fileToArchive.getName()));
Files.copy(fileToArchive.toPath(), zos);
zos.closeEntry();
zos.closeEntry();
for (File file : oldFiles) {
zos.putNextEntry(new ZipEntry(file.getName()));
Files.copy(file.toPath(), zos);
zos.closeEntry();
}
zos.close();
/*First solution.
Was not accepted by the validator*/
/*//First we need to extract the current contents of the archive into a temp directory
Path tempDir = Files.createTempDirectory("temp");
try (ZipInputStream zipInputStream = new ZipInputStream(
new FileInputStream(archive))) {
ZipEntry zipEntry = zipInputStream.getNextEntry();
while (zipEntry != null) {
byte[] buffer = new byte[1024];
int length;
try (FileOutputStream fileOutputStream = new FileOutputStream(tempDir.toFile() + File.separator + zipEntry.getName())) {
while ((length = zipInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, length);
}
}
zipEntry = zipInputStream.getNextEntry();
}
}
//Creating a list of old files to be written in the new archive
List<File> listOfFilesToArchive = new ArrayList<>();
for (File file : tempDir.toFile().listFiles()) {
listOfFilesToArchive.add(file);
}
//Writing all the old files from list of Files to archive into the archive {args[1]}
try (FileOutputStream fileOutputStream = new FileOutputStream(archive);
ZipOutputStream zos = new ZipOutputStream(fileOutputStream)) {
for (File file : listOfFilesToArchive) {
try (FileInputStream fis = new FileInputStream(file)) {
zos.putNextEntry(new ZipEntry(file.getName()));
readFromFileWriteToArchive(fis, zos);
}
}
//Writing the new file {args[0]} into the archive {args[1]}
try (FileInputStream fis = new FileInputStream(fileToArchive)) {
zos.putNextEntry(new ZipEntry("new" + File.separator + fileToArchive.getName()));
readFromFileWriteToArchive(fis, zos);
}
}
}
private static void readFromFileWriteToArchive(FileInputStream fis, ZipOutputStream zos) {
byte[] buffer = new byte[1024];
int length = 0;
while (true) {
try {
if (!((length = fis.read(buffer)) != -1)) break;
} catch (IOException e) {
e.printStackTrace();
}
try {
zos.write(buffer, 0, length);
} catch (IOException e) {
e.printStackTrace();
}
}*/
}
}