code: public static Collection<File> unzipTo(File self, File destination) {
  		checkUnzipDestination(destination);
  		// if destination directory is not given, we'll fall back to the parent directory
  		// of 'self'
  		if (destination == null) {
  			destination = new File(self.getParent());
  		}
  		List<File> unzippedFiles = new ArrayList<>();
  		try (InputStream fileInputStream = Files.newInputStream(self.toPath())) {
  			try (ZipInputStream zipInput = new ZipInputStream(fileInputStream)) {
  				for (ZipEntry entry = zipInput
  						.getNextEntry(); entry != null; entry = zipInput.getNextEntry()) {
  					if (!entry.isDirectory()) {
  						final File file = new File(destination, entry.getName());
  						if (file.getParentFile() != null) {
  							file.getParentFile().mkdirs();
  						}
  						try (OutputStream output = Files.newOutputStream(file.toPath())) {
  							StreamUtils.copy(zipInput, output);
  						}
  						unzippedFiles.add(file);
  					}
  					else {
  						final File dir = new File(destination, entry.getName());
  						dir.mkdirs();
  						unzippedFiles.add(dir);
  					}
  				}
  			}
  		}
  		catch (IOException e) {
  			throw new IllegalStateException("Cannot unzip archive", e);
  		}
  		return unzippedFiles;
  	}
docs: Unzips this file. If the <tt>destination</tt> directory is not provided, it will
  fall back to this file's parent directory.
  @param self file
  @param destination (optional), the destination directory where this file's content
  will be unzipped to.
  @return a {@link Collection} of unzipped {@link File} objects.