Я расширяю класс утилиты, объединяющий набор образов и файлы описания .xml. В настоящее время я храню все файлы в каталоге и загружаю их оттуда. Каталог выглядит следующим образом:Извлечение файлов из Jar более эффективно
8.png
8.xml
9.png
9.xml
10.png
10.xml
...
...
50.png
50.xml
...
Вот мой текущий конструктор. Он молниеносно и делает то, что мне нужно. (Я раздел некоторые проверки ошибок, чтобы сделать его более удобным для чтения):
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);
}
}
Ради WebStart и чистоты, я пытался загрузить эти ресурсы из Jar вместо , У меня это работает, но время загрузки от мгновенного до нескольких секунд, и это неприемлемо. Вот код, который я попробовал (опять же, проверка ошибок раздели):.
(Это не лучший способ сделать то, что я хочу сделать, это макет, чтобы увидеть, если идея сработала Это Ждут» . Тл два для петель никоим образом не является источником проблемы, это процесс создания всех этих InputStreams, что замедляет его)
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);
}
}
Каждый знает лучший способ работать с .jar-файлами, кроме того, как я здесь пробовал? Вот AngelCodeFont API. Если бы это было абсолютно необходимо, я мог бы написать патч для этого, но мне бы этого не хотелось. Мне кажется, что, вероятно, есть способ сделать то, что я хочу сделать, я просто не знаком с этим.
Я не ужасно против того, чтобы быстро сбросить банку во временный каталог, а затем прочитать файлы оттуда, но если есть способ сделать это, читая прямо из банки, я бы скорее сделал это.
Также: компрессия не является проблемой вообще. Единственная причина, по которой я использую банку, - это проблема упаковки.
Сжатие не является проблемой. Простота использования для Webstart. Вот почему я хочу положить его в банку. Спасибо хоть. :-) – JoshuaD