Datei aus Jar kopieren

KlaDi

Erfahrenes Mitglied
Hallo,

ich habe mir folgende Funktion geschrieben:

Code:
public static void fileCopyFromJar(File paJarFile, String sourceFile, String destFile) {
		JarFile jarFile = null;
		try {
			jarFile = new JarFile(paJarFile);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		InputStream in = jarFile.getClass().getResourceAsStream(sourceFile);
		BufferedInputStream bufIn = new BufferedInputStream(in);
		
		BufferedOutputStream bufOut = null;
		
		try {
			bufOut = new BufferedOutputStream(new FileOutputStream(destFile));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		byte[] inByte= new byte[0xFFFF];
		int count = -1;
		try {
			while((count = bufIn.read(inByte)) != -1) {
				bufOut.write(inByte, 0, count);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			bufOut.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			bufIn.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Wenn ich diese nun aufrufe:

Code:
fileCopyFromJar("./plugins/Anwendung.jar", "./Dokumente/Vorlagen/Person.xml", "C:\\Person.xml");

Dann bekomme ich zwar die Datei kopiert, aber leider ohne Inhalt. Also sie ist nur 0 kb groß und drinnen steht auch nix.

Kann mir jemand sagen, wo mein Fehler liegt?

Gruß KlaDi.
 
Moin!
Probiers mal so:
Code:
public static void fileCopyFromJar(File paJarFile, String sourceFile, String destFile) {
        try{
             JarFile jarFile = new JarFile(paJarFile);
             JarEntry entry = jarFile.getJarEntry(sourceFile);
             BufferedInputStream in = new   BufferedInputStream(jarFile.getInputStream(entry));
             BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(destFile));
             byte[] b = new byte[100];
             int count = -1;
             while((count = in.read(b)) != -1){
                 out.write(b);
             }
             in.close();
             out.close();
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
        
    }

Edit:
Damit das mit dem "getRessourceAsStream()" funktioniert muss imho die Datei auch im Classpath liegen, bzw, über einen ClassLoader geladen werden...



*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

leider bekomme ich mit Deinem Code gar keine Dateien mehr kopiert. Habs mal versucht mit dem absoluten Dateipfad der .jar, aber das hilft auch nix.

Gruß KlaDi.
 
Dann scheint dein Aufruf nicht zu stimmen.
Mit folgendem Aufruf funktioniert es bei mir ohne Probleme:
fileCopyFromJar(new File("F:/Console.jar"), "META-INF/MANIFEST.MF", "F:/Manifest.txt");
Wie zu sehen ist, muss die zu extrahierenden Datei als relativer Pfad angegeben werden.

*grüssle*
MeinerEiner
 
Ähm.....:rolleyes:
Ich hatte den Dateipfad nicht ganz richtig angegeben...
Deine Funktion funktioniert wunderbar!
Vielen Dank für die Hilfe!

Gruß KlaDi.

[EDIT]Die Jar-Datei kann auch als relativer Pfad angegeben werden. Funktionert bei mir zumindest.

Hab mein Aufruf jetzt so angepasst:

Code:
fileCopyFromJar("plugins/Anwendung.jar", "Dokumente/Vorlagen/Person.xml", "C:/Person.xml");
 
Zuletzt bearbeitet:
Hallo,

so gings auch:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.FileOutputStream;
import java.nio.channels.Channels;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;

/**
 * @author thomas.darimont
 * 
 */
public class ExtractElementFormJarExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        extractElementFrom(new File(
                "D:/eclipse/3.3M5/eclipse/plugins/org.eclipse.ui.intro_3.2.100.v20070206.jar"),
                "icons/overview_48.gif", "c:/overview.gif");
    }

    public static void extractElementFrom(File theJarFile, String entryName,
            String destFile) throws Exception {
        JarFile jarFile = new JarFile(theJarFile);
        ZipEntry zipEntry = jarFile.getEntry(entryName);
        FileOutputStream destOutputStream = new FileOutputStream(destFile);
        destOutputStream.getChannel().transferFrom(
                Channels.newChannel(jarFile.getInputStream(zipEntry)), 0,
                zipEntry.getSize());
        destOutputStream.close();
        jarFile.close();
    }
}

Gruß Tom
 
Zurück