Устал уже переписывать эту задачу, всё вроде работает. Не подскажите, в чём моя ошибка?
package com.javarush.task.task31.task3105;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
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 {
Path tmpPath = Files.createTempDirectory(Paths.get(args[1]).getParent(), "tempDir");
try(ZipInputStream zin = new ZipInputStream(new FileInputStream(args[1]))) {
ZipEntry entry;
while((entry = zin.getNextEntry()) != null) {
Path entryPath = Paths.get(tmpPath.toAbsolutePath().toString() + "/" + entry.getName());
if (Files.notExists(entryPath.getParent())) Files.createDirectories(entryPath.getParent());
Files.copy(zin, entryPath, StandardCopyOption.REPLACE_EXISTING);
}
}
String entryToAppend = "new/" + args[0].substring(args[0].lastIndexOf("/") + 1);
try(ZipOutputStream out = new ZipOutputStream(new FileOutputStream(args[1], false))) {
out.putNextEntry(new ZipEntry(entryToAppend));
Files.copy(Paths.get(args[0]), out);
ZippingFileVisitor visitor = new ZippingFileVisitor(out, tmpPath, args[0]);
Files.walkFileTree(tmpPath, visitor);
}
}
}
class ZippingFileVisitor extends SimpleFileVisitor<Path> {
private ZipOutputStream out;
private Path source;
private String toAppend;
public ZippingFileVisitor(ZipOutputStream out, Path source, String toAppend) {
this.out = out;
this.source = source;
this.toAppend = toAppend;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (Files.isSameFile(file, Paths.get(toAppend))) return FileVisitResult.CONTINUE;
ZipEntry entry = new ZipEntry(source.relativize(file).toString());
out.putNextEntry(entry);
Files.copy(file, out);
return super.visitFile(file, attrs);
}
}