Extract a file from a JarTag(s): IO Environment
This HowTo will extract a file, mydb.mdb, from a Jar. You access a Jar with the URL class, using a special notation (note the "!").
Grab this Jar if you want to try it locally.
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.JarURLConnection; import java.net.URL; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class JarStuff { public static void listJarContent () throws Exception { // to access a Jar from the local file system // URL url = new URL("jar:file:/c:/temp/mydb.jar!/"); // to access a Jar from http URL url = new URL("jar:http://www.rgagnon.com/examples/mydb.jar!/"); JarURLConnection conn = (JarURLConnection)url.openConnection(); JarFile jarfile = conn.getJarFile(); Enumeration<JarEntry> content = jarfile.entries(); while (content.hasMoreElements()) { System.out.println(content.nextElement()); } /* output: META-INF/ META-INF/MANIFEST.MF ExtractFromJAR.class mydb.mdb */ } public static void extractContentFromJar() throws Exception { InputStream in = null; OutputStream out = null; try { // to access a Jar content from the local file system // URL url = new URL("jar:file:/c:/temp/mydb.jar!/mydb.mdb"); // to access a Jar content from http URL url = new URL("jar:http://www.rgagnon.com/examples/mydb.jar!/mydb.mdb"); JarURLConnection conn = (JarURLConnection)url.openConnection(); JarFile jarfile = conn.getJarFile(); JarEntry jarEntry = conn.getJarEntry(); in = new BufferedInputStream(jarfile.getInputStream(jarEntry)); out = new BufferedOutputStream(new FileOutputStream("c:/temp/mydb.mdb")); byte[] buffer = new byte[2048]; for (;;) { int nBytes = in.read(buffer); if (nBytes <= 0) break; out.write(buffer, 0, nBytes); } } finally { if (in != null) { in.close(); } if (out != null) { out.flush(); out.close(); } } } public static void main (String ... args) throws Exception { listJarContent(); extractContentFromJar(); } }
The following snippet extract a file (mydb.mdb) from a jar.
import java.io.*; import java.util.jar.*; import java.util.zip.*; public class ExtractFromJAR { public void extractMyMDBromJAR(String dest){ try { String home = getClass().getProtectionDomain(). getCodeSource().getLocation().toString(). substring(6); JarFile jar = new JarFile(home); ZipEntry entry = jar.getEntry("mydb.mdb"); File efile = new File(dest, entry.getName()); InputStream in = new BufferedInputStream(jar.getInputStream(entry)); OutputStream out = new BufferedOutputStream(new FileOutputStream(efile)); byte[] buffer = new byte[2048]; for (;;) { int nBytes = in.read(buffer); if (nBytes <= 0) break; out.write(buffer, 0, nBytes); } out.flush(); out.close(); in.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args []){ new ExtractFromJAR().extractMyMDBFromJAR("."); } }
To create an auto-run JAR, first create a manifest.mft
Manifest-Version: 1.0 Classpath: .\mydb.jar Main-Class: ExtractFromJAR
C:\jdk141\bin\jar cvfm mydb.jar manifest.mft ExtractFromJAR.class mydb.mdb
java -jar mydb.jar
(A tip from Fred Hommersom) Your code reads:
String home = getClass().getProtectionDomain(). getCodeSource().getLocation().toString().substring(6);
String home = getClass().getProtectionDomain() .getCodeSource().getLocation() .getPath().replaceAll("%20", " ");