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", " ");
  mail_outline
Send comment, question or suggestion to howto@rgagnon.com
Send comment, question or suggestion to howto@rgagnon.com
