Domanda

Ho un'applicazione scritta in Java che utilizza un file jar (ne utilizza più di uno, ma non è questo il punto).

Il fatto è che il file Jar che sto usando contiene file che DEVO assolutamente estrarre nel filesystem.

Finora sto usando Class.getResourceAsStream e FileOutputStream, ma questo metodo è piuttosto lento. Nota che alcuni di questi file sono basati su testo, ma altri sono semplicemente binari.

Quindi oltre a cercare di ridurre la necessità di estrarre file dai JAR, ci sono delle ottimizzazioni (come funzioni più adeguate) per questi compiti.

Nota che la mia applicazione è basata su Java 6 e vorrei ridurre al minimo le dipendenze esterne.

EDIT: per riferimento futuro, il mio codice OLD (inefficace) era:

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

Per il nuovo codice molto più veloce, vedi la risposta accettata.

È stato utile?

Soluzione

Hai il controllo sul file jar? Se lo crei non compresso, potrebbe renderlo più veloce. Ovviamente renderà il file jar più grande però ...

Un'altra cosa da controllare: come stai estraendo il file? Ad esempio, se lo fai byte per byte, sarà dolorosamente lento. Usa qualcosa del genere:

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);
    }
}

Se lo stai già facendo, potresti darci maggiori informazioni? Quanto è lento "piuttosto lento"? Come si confronta, ad esempio, con l'utilità jar per estrarre il file jar?

Altri suggerimenti

Err. Non sono sicuro di cosa tu voglia davvero fare, ma hai pensato di usare winzip?

Ovviamente se devi estrarre dinamicamente i file in fase di esecuzione questo non funzionerà - ma non sono sicuro del motivo per cui dovresti farlo - con quale frequenza cambia questo file jar ?.

Sicuramente puoi estrarli una volta e poi distribuirli con l'applicazione?

Concordo con Jon. 2 cose renderanno più veloce l'estrazione:

  1. Riduzione del livello di compressione.
  2. Aumentando le dimensioni del buffer utilizzate durante la copia / estrazione.

Suppongo che la necessità di estrarre sia dovuta al requisito di scrivere / rileggere dal file. Se i file sono abbastanza piccoli, la memoria è abbastanza grande e la natura persistente dei file non è un requisito; potresti considerare di mappare l'intera risorsa in memoria invece di utilizzare il disco come memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top