private void copyData(InputStream in, OutputStream out) throws Exception {
            byte[] buffer = new byte[8 * 1024];
            int len;
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
    }

    public void extractAll(Path outputFolder) throws Exception {
        if (!Files.isRegularFile(zipFile)) throw new WrongZipFileException();

        if (Files.notExists(outputFolder)) Files.createDirectories(outputFolder);

        try(ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipFile))) {

            ZipEntry zipEntry;

            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
                Path absolute = outputFolder.resolve(zipEntry.getName());
                Files.createDirectories(absolute.getParent());
                try(OutputStream out = Files.newOutputStream(absolute)) {
                    copyData(zipInputStream, out);
                }
            }
            zipInputStream.closeEntry();
        }