Java 資源與 iOS 資源的對應方式

什麼是 Java 資源

Java 資源是封裝於 Java 應用程式和程式庫的資料檔案。這些資源會在執行階段載入 Class.getResource(String name),並傳回 java.net.URLClass.getResourceAsStream(String name),後者會傳回 java.io.InputStream。通常在預計可使用資源時就會使用 getResourceAsStream() 方法,因為如果不存在,就會擲回 IOException。如果資源不存在,getResource() 方法會傳回空值,因此建議您測試選用資源。

資源名稱和路徑

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") 的完整資源路徑為 /oops/error.jpg,並忽略 foo.bar 套件名稱。

將資源加入 iOS 應用程式

如要在 Xcode 中將資源檔案新增至 iOS 應用程式,請開啟建構目標的「Build Phases」分頁。接著:

  • 按一下「一般」分頁下方的「+」+圖示,然後選取「新增複製檔案階段」。
  • 選取 [Resources] 做為目的地 (而非 Java 資源)。
  • 指定資源的目錄。
  • 選取「+」+即可將檔案新增至清單。

無論使用相對資源路徑或絕對資源路徑,每個資源目錄在 Xcode 版本中都需要單獨的「複製檔案」建構階段。

範例

JreEmulation 專案有「JRE JUnit Tests」應用程式,可執行該程式庫的單元測試。選取該目標的「建構階段」,即可查看多個「複製檔案」階段,每個階段對於其資源使用的每個相對路徑各有一個階段。在這裡,ClassTest.java 會使用絕對路徑和相對路徑載入相同的資源。這個「複製檔案」建構階段會包含測試的資源:

Xcode 資源