gpt4 book ai didi

java - 更有效地从 Jar 中提取文件

转载 作者:行者123 更新时间:2023-12-04 07:09:56 25 4
gpt4 key购买 nike

我正在扩展一个实用程序类,该类捆绑了一组图像和 .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 加载这些资源。我已经让它工作了,但是加载时间从瞬间变成了几秒钟,这是 Not Acceptable 。这是我试过的代码(再次,错误检查被剥离):

(这不是做我想做的事情的最佳方式,它是一个模型,看看这个想法是否有效。它没有。这两个 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 中快速读取,我宁愿这样做。

另外:压缩根本不是问题。我使用 jar ​​子的唯一原因是包装问题。

最佳答案

打开 JAR 是一项非常昂贵的操作。因此,您可能希望打开 JAR 一次并保留 JarFile某处静态字段中的实例。在您的情况下,您还需要读取所有条目并将它们保存在哈希图中,以便即时访问您需要的资源。

另一种解决方案是将 JAR 放在类路径上并使用

DivineFont.class.getContextClassLoader().getResource*("/8.png");

注意“/”!如果省略它,Java 将在找到文件 DivineFont.class 的同一目录(包)中进行搜索。

从类路径中获取东西在 Java 中已经优化到死。

关于java - 更有效地从 Jar 中提取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/542127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com