我正在扩展一个实用程序类,它捆绑了一组图像和 .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);
}
}
为了 webstart 和清洁,我一直在尝试从 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 中快速读取,我宁愿这样做。
另外:压缩根本不是问题。我使用罐子的唯一原因是包装问题。