Frage

Ich habe eine Anwendung in Java geschrieben, die eine jar-Datei verwendet (es verwendet als ein, aber das ist nicht der Punkt).

Die Tatsache ist, dass die JAR-Datei Ich verwende enthält Dateien, die ich unbedingt auf das Dateisystem extrahieren muss.

Bisher bin ich mit Class.getResourceAsStream und Outputstream, aber diese Methode ist etwas langsam. Beachten Sie, dass einige dieser Dateien sind textbasiert, aber andere sind einfach binär.

Also abgesehen von dem Versuch, die Notwendigkeit zu reduzieren Dateien von JAR-Dateien zu extrahieren, gibt es Optimierungen (zB mehr adequated Funktionen) für diese Aufgaben.

Beachten Sie, dass meine Anwendung ist Java 6-basierte, und ich möchte externe Abhängigkeiten auf ein Minimum reduzieren.

EDIT: Für die Zukunft, mein OLD (ineffizienter) Code war:

int c;
while((c = is.read())!=-1){
    fos.write(c);
}

Für den neuen, viel schnellen Code finden Sie in die akzeptierte Antwort.

War es hilfreich?

Lösung

Sie haben die Kontrolle über die JAR-Datei? Wenn Sie es unkomprimiert schaffen, dass können es schneller machen. Offensichtlich wird es die JAR-Datei größer obwohl machen ...

Eine andere Sache zu prüfen - wie werden Sie die Datei zu extrahieren? Zum Beispiel, wenn Sie es Byte für Byte tun wird es sehr langsam sein. Verwenden Sie so etwas wie folgt aus:

public static void copyStream(InputStream input, OutputStream output)
     throws IOException
{
    // Reads up to 8K at a time. Try varying this.
    byte[] buffer = new byte[8192];
    int read;

    while ((read = input.read(buffer)) != -1)
    {
        output.write(buffer, 0, read);
    }
}

Wenn Sie bereits dies zu tun, könnten Sie uns weitere Informationen geben? Wie langsam ist „etwas langsam“? Wie funktioniert es vergleichen mit, sagen wir, das Glas-Dienstprogramm die JAR-Datei zu extrahieren?

Andere Tipps

Err. Ich bin mir nicht sicher, was Sie wirklich wollen - aber haben Sie darüber nachgedacht, winzip mit

?

Natürlich, wenn Sie die Dateien dynamisch zur Laufzeit extrahieren müssen dies wird nicht funktionieren - aber ich bin nicht sicher, warum Sie brauchen würden, dies zu tun - wie oft hat diese JAR-Datei ändern ?.

Sicherlich kann man sie einmal extrahieren und sie dann mit der Anwendung verteilen?

Ich stimme mit Jon. 2 Dinge Extraktion schneller machen:

  1. Eine Verringerung Komprimierungsstufe.
  2. sized den Puffer Erhöhung verwendet beim Kopieren / Extrahieren.

ich das Bedürfnis habe angenommen zu extrahieren ist auf eine Anforderung aufgrund zu schreiben / aus der Datei wieder lesen. Wenn die Dateien klein genug sind, ist der Speicher groß genug und die anhaltende Natur von Dateien ist nicht erforderlich; Sie betrachten könnte die gesamte Ressource Speicherzuordnung anstelle der Festplatte als Speicher verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top