Question

J'ai une application écrite en Java qui utilise un fichier jar (elle en utilise plusieurs, mais ce n'est pas le problème).

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 un peu lente. Notez que certains de ces fichiers sont basés sur du texte, mais que d’autres sont simplement binaires.

Outre le fait d’essayer de réduire le besoin d’extraire des fichiers des fichiers JAR, existe-t-il des optimisations (telles que des fonctions mieux adaptées) pour ces tâches?

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

EDIT: pour référence future, mon code OLD (inefficent) était le suivant:

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

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

Était-ce utile?

La solution

Avez-vous le contrôle sur le fichier jar? Si vous le créez non compressé, cela pourrait l'accélérer. De toute évidence, le fichier jar sera plus volumineux ...

Autre chose à vérifier: comment extrayez-vous le fichier? Par exemple, si vous le faites octet par octet, il sera terriblement 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 le faites déjà, pourriez-vous nous donner plus d'informations? Quelle est la lenteur "un peu lent"? Comment cela se compare-t-il avec, par exemple, l'utilisation de l'utilitaire jar pour extraire le fichier jar?

Autres conseils

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

Évidemment, si vous devez extraire les fichiers de manière dynamique au moment de l'exécution, cela ne fonctionnera pas (mais je ne suis pas sûr de la raison pour laquelle vous devez le faire), à ??quelle fréquence ce fichier jar change-t-il ?.

Vous pouvez sûrement les extraire une fois, puis les distribuer avec l'application?

Je suis d'accord avec Jon. 2 choses vont accélérer l'extraction:

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

Je suppose que la nécessité d'extraire est due à l'obligation d'écrire / de relire à partir du fichier. Si les fichiers sont suffisamment petits, la mémoire est suffisamment grande et la nature persistante des fichiers n'est pas obligatoire. vous pouvez envisager de mapper l'intégralité de la ressource vers la mémoire au lieu d'utiliser le disque comme stockage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top