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