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 next section is the old version of this HowTo, it is deprecated since it is based on the java.util.zip API.
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(".");
 }

}
Grab this auto-run Jar if you want to try it.

To create an auto-run JAR, first create a manifest.mft

Manifest-Version: 1.0
Classpath: .\mydb.jar
Main-Class: ExtractFromJAR
Create the JAR
C:\jdk141\bin\jar cvfm mydb.jar manifest.mft ExtractFromJAR.class mydb.mdb
Run it ... and the mydb.mdb file should appear in the current directory.
java -jar mydb.jar

(A tip from Fred Hommersom) Your code reads:
String home = getClass().getProtectionDomain().
                 getCodeSource().getLocation().toString().substring(6);
 
I got a problem when the jar file was located in C:\Program Files\xyz due to the embedded space. So I modified the code to
String home = getClass().getProtectionDomain()
                   .getCodeSource().getLocation()
                      .getPath().replaceAll("%20", " ");

blog comments powered by Disqus