code: public static FileUtils.FileCopyResult unzip(InputStream in, File outDir) throws IOException
    {
      try (final ZipInputStream zipIn = new ZipInputStream(in)) {
        final FileUtils.FileCopyResult result = new FileUtils.FileCopyResult();
        ZipEntry entry;
        while ((entry = zipIn.getNextEntry()) != null) {
          final File file = new File(outDir, entry.getName());
  
          validateZipOutputFile("", file, outDir);
  
          NativeIO.chunkedCopy(zipIn, file);
  
          result.addFile(file);
          zipIn.closeEntry();
        }
        return result;
      }
    }
docs: Unzip from the input stream to the output directory, using the entry's file name as the file name in the output directory.
  The behavior of directories in the input stream's zip is undefined.
  If possible, it is recommended to use unzip(ByteStream, File) instead
  
  @param in     The input stream of the zip data. This stream is closed
  @param outDir The directory to copy the unzipped data to
  
  @return The FileUtils.FileCopyResult containing information on all the files which were written
  
  @throws IOException