2 Stimmen

Extrahieren eines Jars aus dem momentan laufenden Jar

Ich versuche, 2 Jar-Dateien aus der gerade laufenden Jar-Datei zu extrahieren, aber sie landen immer bei 2 kb, obwohl ihre Größen 104 kb und 1,7 mb sind. Hier ist was ich habe:

public static boolean extractFromJar(String fileName, String dest) {
    if (Configuration.getRunningJarPath() == null) {
        return false;
    }
    File file = new File(dest + fileName);
    if (file.exists()) {
        return false;
    }

    if (file.isDirectory()) {
        file.mkdir();
        return false;
    }
    try {
        JarFile jar = new JarFile(Configuration.getRunningJarPath());
        Enumeration e = jar.entries();
        while (e.hasMoreElements()) {
            JarEntry je = e.nextElement();
            InputStream in = new BufferedInputStream(jar.getInputStream(je));
            OutputStream out = new BufferedOutputStream(
                    new FileOutputStream(file));
            copyInputStream(in, out);
        }
        return true;
    } catch (Exception e) {
        Methods.debug(e);
        return false;
    }
}

private final static void copyInputStream(InputStream in, OutputStream out)
        throws IOException {
    while (in.available() > 0) {
        out.write(in.read());
    }
    out.flush();
    out.close();
    in.close();
}

2voto

Eugene Kuleshov Punkte 30863

Dies sollte besser funktionieren als sich auf die Methode InputStream.available() zu verlassen:

private final static void copyInputStream(InputStream in, OutputStream out)
        throws IOException {
    byte[] buff = new byte[4096];
    int n;
    while ((n = in.read(buff)) > 0) {
        out.write(buff, 0, n);
    }
    out.flush();
    out.close();
    in.close();
}

1voto

Ravinder Reddy Punkte 22962

available()-Methode ist nicht zuverlässig zum Lesen von Daten, da es nur eine Schätzung ist, gemäß der Dokumentation.
Sie müssen sich auf die read()-Methode verlassen, bis ein Wert größer als 0 zurückgegeben wird.

byte[] contentBytes = new byte[ 4096 ];  
int bytesRead = -1;
while ( ( bytesRead = inputStream.read( contentBytes ) ) > 0 )   
{   
    out.write( contentBytes, 0, bytesRead );  
} // while available

Sie können eine Diskussion darüber führen, was die Probleme mit available() sind unter hier.

0voto

Elimicky Punkte 31

Ich bin mir nicht sicher, wie man Gläser extrahiert, aber jedes Glas ist tatsächlich eine Zip-Datei, also können Sie versuchen, es zu entpacken.

Sie können hier herausfinden, wie man in Java entpackt: Wie entpackt man Dateien rekursiv in Java?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X