package com.bvn13.covid19.scheduler; import java.io.*; import java.util.Hashtable; /** * @see 'https://coderwall.com/p/d0kssw/resource-extraction-from-jar-to-local-file-system' */ public class ResourceManager { // Stores paths to files with the global jarFilePath as the key private static Hashtable fileCache = new Hashtable(); /** * Extract the specified resource from inside the jar to the local file system. * @param jarFilePath absolute path to the resource * @return full file system path if file successfully extracted, else null on error */ public static String extract(String jarFilePath){ if(jarFilePath == null) return null; // See if we already have the file if(fileCache.contains(jarFilePath)) return fileCache.get(jarFilePath); // Alright, we don't have the file, let's extract it try { // Read the file we're looking for InputStream fileStream = ResourceManager.class.getResourceAsStream(jarFilePath); // Was the resource found? if(fileStream == null) return null; // Grab the file name String[] chopped = jarFilePath.split("\\/"); String fileName = chopped[chopped.length-1]; // Create our temp file (first param is just random bits) File tempFile = File.createTempFile("covid19-", fileName); // Set this file to be deleted on VM exit tempFile.deleteOnExit(); // Create an output stream to barf to the temp file OutputStream out = new FileOutputStream(tempFile); // Write the file to the temp file byte[] buffer = new byte[1024]; int len = fileStream.read(buffer); while (len != -1) { out.write(buffer, 0, len); len = fileStream.read(buffer); } // Store this file in the cache list fileCache.put(jarFilePath, tempFile.getAbsolutePath()); // Close the streams fileStream.close(); out.close(); // Return the path of this sweet new file return tempFile.getAbsolutePath(); } catch (IOException e) { return null; } } }