2011-12-30 13 views
0

私はJavaで小さなゲームを開発しています。私のすべてのファイルはdataというフォルダ内にバンドルされています。しかし、私はこれらのファイルを1つのファイル、.pak、.zipなどにパックして、散在するときに使用したいと思います。私のゲームはさまざまなパッケージで動作するように計画されているので、多くのファイルを含むフォルダの代わりに1つのファイルを作成するほうが簡単です。私はZipの圧縮/解凍を検討しましたが、それらを読み込む仮想ファイルシステムを作成したいだけで、圧縮や保護は必要ありません。Javaの仮想ファイルシステム内で単一ファイルのアセットを処理する方法

あなたは何を提案しますか?仮想化ライブラリはありますか?私のパッケージを簡単に作成することも重要です。

+0

zip圧縮をオフにすることができます。http://docs.oracle.com/javase/1.4.2/docs/api/java/util/zip/Deflater.html#NO_COMPRESSION – wowest

答えて

2

データファイルをクラスと同じディレクトリに配置し、クラスパス(Class.getResourceAsStream())を使用して読み込むことができます。この方法で、すべてのデータを含むアプリケーションをパッケージ化できます1つのJarファイル

Mavenを使用している場合は、resourcesセクションに挿入します。

これらを個別に配布する場合は、基本的に同じことができます。アプリケーションをコード用とデータ用の2つのJarファイルに配布するだけです。それらをクラスパスの両方に置くと、今説明した方法でデータにアクセスできます。その後、アプリケーションのデータ部分を解放してビルドすることができます。

+0

しかし、私はパッケージ化したくありません私のアプリケーション全体を単一のJarファイルにするために、私はGame.jarとdata.pakファイルを別々にしたいので、data.pakファイルはビルドする必要なしに変更できます。 – Mustafa

+0

@ムスタファ:私の答えを読んでください。クラスパス上にある限り、任意の場所にあるアセットでjar(またはzip)を保持できます。どのIDEでも必要なMANIFEST.MFが生成されます。 – fdreger

+0

ありがとうございますが、zipやその他のファイルを仮想システム経由で直接読めるようにする方法を尋ねています。私は毎回自分のファイルを抽出したくありません – Mustafa

2

普通の方法は、.classファイルとともに資産を保持することです(99%のケースでは、ビルドする実行可能なjarの中にあります)。このようにして、クラスローダによって読み込むことができます。

package pl.alx.example; 

class Whatever { 
    public Whatever(){ 
     // I assume that you keep your image in the same folder as Whatever 
     InputStream is = this.getClass().getResourceAsStream("/pl/alx/example/file.png"); 
     // read the png 

    } 
} 

場合は、別々のファイルにコンパイルされたクラスとリソースを維持を主張何らかの理由で、あなたはまだすることができ:これは、あなたのゲームがパッケージ化されている方法を変更または展開ディレクトリから実行した場合、リソースが発見されることを保証しますこのテクニックを使用してください。リソースを持つjarをクラスパスに追加してください(あなたのIDEはそれを行います)。

関連する問題