2009-06-20 8 views
1

J'ai une application écrite en Java qui utilise un fichier jar (il en utilise plus d'un, mais ce n'est pas le but).Extraction efficace d'un fichier à partir d'un fichier jar

Le fait est que le fichier Jar que j'utilise contient des fichiers que je DOIS absolument extraire dans le système de fichiers. Jusqu'à présent, j'utilise Class.getResourceAsStream et FileOutputStream, mais cette méthode est plutôt lente. Notez que certains de ces fichiers sont basés sur du texte, mais d'autres sont simplement binaires. En plus d'essayer de réduire le besoin d'extraire les fichiers des JAR, y a-t-il des optimisations (telles que des fonctions plus adéquates) pour ces tâches?

Notez que mon application est basée sur Java 6 et que je souhaite réduire au minimum les dépendances externes.

EDIT: Pour référence ultérieure, mon VIEUX code (inefficent) était:

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

Pour le nouveau code beaucoup plus rapide, voir la réponse acceptée.

Répondre

7

Avez-vous le contrôle du fichier JAR? Si vous le créez non compressé, cela peut le rendre plus rapide. Évidemment, cela va rendre le fichier jar plus gros ...

Une autre chose à vérifier - comment extrayez-vous le fichier? Par exemple, si vous le faites octet par octet, il sera douloureusement lent. Utilisez quelque chose comme ceci:

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

Si vous faites déjà cela, pourriez-vous nous donner plus d'informations? Combien lent est "un peu lent"? Comment cela se compare-t-il, disons, en utilisant l'utilitaire jar pour extraire le fichier jar?

+0

Je copiais vraiment byte by byte! Il est nettement plus rapide maintenant! Merci! – luiscubal

1

Err. Je ne suis pas sûr de ce que vous voulez vraiment faire - mais avez-vous pensé à utiliser winzip?

Évidemment, si vous avez besoin d'extraire les fichiers dynamiquement au moment de l'exécution, cela ne fonctionnera pas - mais je ne sais pas pourquoi vous auriez besoin de faire cela - à quelle fréquence ce fichier jar change-t-il?

Sûrement vous pouvez les extraire une fois et ensuite les distribuer avec l'application?

0

Je suis d'accord avec Jon. 2 choses rendront l'extraction plus rapide:

  1. Diminution du niveau de compression.
  2. Augmentation de la taille du tampon utilisée lors de la copie/extraction.

Je suppose que le besoin d'extraire est dû à une exigence d'écriture/relecture du fichier. Si les fichiers sont assez petits, la mémoire est assez grande et la nature persistante des fichiers n'est pas une exigence; vous pouvez envisager de mapper la ressource entière en mémoire au lieu d'utiliser le disque comme stockage.

+0

Le fichier fait environ 165 Ko. Le pot est aussi compressé que NetBeans le produit. – luiscubal

Questions connexes