public void extract(File zippedFile, File unzipDirectory) throws IOException
	{
		zipLogger.info("Unzipping file " + zippedFile + " to directory " + unzipDirectory);
		
		if(unzipDirectory.exists() && !unzipDirectory.isDirectory())
		{
			zipLogger.severe("Unable to unzip! " + unzipDirectory + " exists, and it is not a directory!");
			throw new IOException(unzipDirectory + " is not a directory.");
		}
		
		// Make parent directory.
		unzipDirectory.mkdirs();
		
		// Try with resources to load zip stream, etc.
		try(ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zippedFile)))
		{
			ZipEntry entry;
						
			while((entry = zipInputStream.getNextEntry()) != null)
			{
				String entryFileName = entry.getName();
				
				zipLogger.finer("Found zip entry " + entryFileName);
				
				String entryFullPath = (unzipDirectory + File.separator + entryFileName).trim();
				
				zipLogger.finer("Full output path enumerated to " + entryFullPath);
				
				File entryOutputFile = new File(entryFullPath);
				
				if(entry.isDirectory())
				{
					// Entry is in fact a directory, so lets just make directories and leave it at that.
					entryOutputFile.mkdirs();
					zipLogger.finer("Entry " + entryFileName + " is a directory. Moving to next.");
					continue;
				}
				
				zipLogger.finer("Make parent directories for " + entryFileName);
				entryOutputFile.getParentFile().mkdirs();
				
				zipLogger.finer("Writing " + entryFileName + " to uncompressed file " + entryOutputFile);
				
				// Another try with resources, this time to write the contents of the entry file.
				try(BufferedOutputStream entryOutputStreamBuffer = new BufferedOutputStream(new FileOutputStream(entryOutputFile)))
				{
					int bufferSize = 1024;
					byte[] buffer = new byte[bufferSize];
					int read;
					
					while((read = zipInputStream.read(buffer, 0, bufferSize)) >= 0)
					{
						entryOutputStreamBuffer.write(buffer, 0, read);
					}
				}
			}
		}
	}