J'étends une classe utilitaire qui regroupe un ensemble d'images et de fichiers de description .xml. Actuellement, je garde tous les fichiers dans un répertoire et les charge à partir de là. Le répertoire ressemble à ceci:Extraire des fichiers d'un Jar plus efficacement
8.png
8.xml
9.png
9.xml
10.png
10.xml
...
...
50.png
50.xml
...
Voici mon constructeur actuel. Il est rapide comme l'éclair et fait ce que j'ai besoin de faire. (Je l'ai déshabillé certains de l'erreur de vérification pour le rendre plus facile à lire):
public DivineFont(String directory) {
File dir = new File(directory);
//children is an array that looks like this: '10.fnt', '11.fnt', etc.
String[] children = dir.list(fntFileFilter);
fonts = new Hashtable<Integer, AngelCodeFont>(100);
AngelCodeFont buffer;
int number;
String fntFile;
String imgFile;
for(int k = 0; k < children.length; k++) {
number = Integer.parseInt(children[k].split("\\.")[0]);
fntFile = directory + File.separator + number + ".xml";
imgFile = directory + File.separator + number + ".png";
buffer = new AngelCodeFont(fntFile, imgFile);
fonts.put(number, buffer);
}
}
Par souci de webstart et de la propreté, j'ai essayé de charger ces ressources à partir d'un pot à la place . Je l'ai fonctionné, mais le temps de chargement est passé de instantané à quelques secondes, et ce n'est pas acceptable. Voici le code que j'ai essayé (encore une fois, la vérification d'erreurs dépouilla):.
(Ce n'est pas mieux façon de faire ce que je veux faire, c'est une maquette pour voir si l'idée a travaillé Il n » ai pas . t les deux boucles for est en aucun cas la source du problème, c'est le processus de création de tous ces InputStreams qu'il ralentit)
public DivineFont(String jarFileName) {
JarFile jarfile = new JarFile(jarFileName);
Enumeration<JarEntry> em = jarfile.entries();
ArrayList<Integer> fontHeights = new ArrayList<Integer>(100);
for (Enumeration em1 = jarfile.entries(); em1.hasMoreElements();) {
String fileName = em1.nextElement().toString();
if(fileName.endsWith(".fnt")) {
fontHeights.add(Integer.parseInt(fileName.split("\\.")[0]));
}
}
fonts = new Hashtable<Integer, AngelCodeFont>(100);
AngelCodeFont buffer;
int number;
for(int k = 0; k < fontHeights.size(); k++) {
number = fontHeights.get(k);
InputStream fntFileStream = jarfile.getInputStream(jarfile.getEntry(number + ".xml"));
InputStream pngFileStream = jarfile.getInputStream(jarfile.getEntry(number + ".png"));
buffer = new AngelCodeFont(String.valueOf(number), fntFileStream, pngFileStream);
fonts.put(number, buffer);
}
}
Quelqu'un sait d'une meilleure façon de travailler avec des fichiers .jar en plus de la façon dont j'ai essayé ici? Voici le AngelCodeFont API. Si c'était absolument nécessaire, je pourrais soumettre un patch pour ça, mais je préférerais ne pas le faire. Il me semble qu'il y a probablement un moyen de faire ce que je veux faire, je ne le connais tout simplement pas. Je ne suis pas très contre de rapidement jeter le fichier jar dans un répertoire temporaire, puis de lire les fichiers à partir de là, mais s'il y a un moyen de le lire directement depuis le pot rapidement, je préfèrerais le faire.
Aussi: La compression n'est pas un problème du tout. La seule raison pour laquelle j'utilise un pot est pour le problème d'emballage.
La compression n'est pas le problème. Facilité d'utilisation pour Webstart. C'est pourquoi je veux le mettre dans un pot. Merci quand même. :-) – JoshuaD