一連の画像と .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 からこれらのリソースをロードしようとしました。動作していますが、読み込み時間が一瞬から数秒になり、許容できません。これが私が試したコードです(ここでも、エラーチェックは削除されています):
(これは私がやりたいことを実行するための最良の方法ではありません。アイデアが機能するかどうかを確認するためのモックアップです。機能しませんでした。2 つの 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 から直接読み取りをすばやく行う方法がある場合は、むしろそれを実行したいと思います。
また、圧縮はまったく問題ではありません。私が瓶を使用している唯一の理由は、梱包の問題です。