Я расширяю служебный класс, который объединяет набор изображений и XML-файлы описания. В настоящее время я храню все файлы в каталоге и загружаю их оттуда. Каталог выглядит так:
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);
}
}
Ради веб-старта и чистоты я пытался вместо этого загрузить эти ресурсы из Jar-файла. У меня это работает, но время загрузки изменилось с мгновенного до нескольких секунд, и это не приемлемо. Вот код, который я попробовал (опять же, проверка ошибок убрана):
(Это не лучший способ сделать то, что я хочу сделать, это макет, чтобы увидеть, сработала ли идея. Это не сработало. Два цикла for в путь к источнику проблемы, это процесс создания всех тех 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 . Если бы это было абсолютно необходимо, я мог бы представить патч для этого, но я бы предпочел не делать этого. Мне кажется, что, вероятно, есть способ сделать то, что я хочу, я просто не знаком с этим.
Я не очень против быстрого сброса jar-файла во временный каталог и последующего чтения файлов оттуда, но если есть способ быстро выполнить чтение непосредственно из jar-файла, я бы предпочел сделать это.
Также: сжатие вообще не проблема. Единственная причина, по которой я использую банку - это проблема с упаковкой.