Java リソースとは
Java リソースは、Java アプリケーションおよびライブラリにパッケージ化されたデータファイルです。これらのリソースは、java.net.URL
を返す Class.getResource(String name)
か、java.io.InputStream
を返す Class.getResourceAsStream(String name)
または実行時に読み込まれます。getResourceAsStream()
メソッドは、通常、リソースが利用可能であることが想定される場合に使用されます。利用できない場合は IOException
をスローします。リソースが存在しない場合、getResource()
メソッドは null を返すため、オプションのリソースをテストすると便利です。
リソース名とパス
J2ObjC は、リソースの相対パスまたは絶対パスを使用してアプリケーションのメインバンドル([NSBundle mainBundle]
)内でリソースを探します。
相対パス
リソースパスを指定する際は、相対パスを使用することをおすすめします。相対パスはスラッシュ(「/」)で始まっていません。相対パスを持つリソースを読み取る場合、クラスのパッケージ名が変更され、パッケージ名のピリオド(「.」)がスラッシュ(「/」)に変更され、Class.getResource(String name)
または Class.getResourceAsStream(String name)
メソッド呼び出しで指定された相対パスがパッケージ パスに追加されます。
たとえば、アプリに foo.bar.Mumble
クラスがある場合、そのパッケージ内のクラスを基準とするすべてのリソースのベースパスは /foo/bar
です。Mumble.class.getResource("oops/error.jpg")
が呼び出されると、oops/error.jpg
がパッケージのパスに付加されるため、その完全なリソースパスは /foo/bar/oops/error.jpg
になります。
絶対パス
リソースには、リソースの名前をスラッシュ(「/」)で始めることで、絶対パスを使用してアクセスすることもできます。パッケージ名は無視されるため、J2ObjC は、アプリの Java ソースの Class.getResource(String name)
参照または Class.getResourceAsStream(String name)
参照に指定されたパスを使用して、アプリケーションのメインバンドル内の絶対パスを特定します。上記の例では、Mumble.class.getResource("/oops/error.jpg")
には foo.bar
パッケージ名を無視して /oops/error.jpg
の完全なリソースパスが含まれています。
iOS アプリにリソースを追加する
Xcode で iOS アプリにリソース ファイルを追加するには、ビルド ターゲットの [Build Phases] タブを開きます。以下の手順を行います。
- [General] タブの [+] アイコンをクリックし、[New Copy Files Phase] を選択します。
- [Destination] で [Resources] を選択します([Java Resources] ではありません)。
- リソースのディレクトリを指定します。
- [+] を選択し、リストにファイルを追加します。
相対リソースパスと絶対リソースパスのどちらを使用するかにかかわらず、各リソース ディレクトリには、Xcode ビルドで個別の「ファイルのコピー」ビルドフェーズが必要です。
例
JreEmulation プロジェクトには、ライブラリの単体テストを実行する「JRE JUnit Tests」アプリがあります。ターゲットのビルドフェーズを選択すると、リソースで使用されるすべての相対パスに 1 つずつ、複数のファイルのコピー フェーズが表示されます。ここで ClassTest.java は、最初に絶対パスを使用してから相対パスを使用して同じリソースを読み込みます。テストのリソースは、次の Copy Files ビルドフェーズを使用して組み込まれます。