簡體   English   中英

Java - 跨平台文件路徑

[英]Java - Cross-platform filepath

我正在嘗試使用 JavaFX 和 Gluon 開發一個可以在桌面和 Android 上運行的跨平台應用程序。

在運行時,我的代碼在我的資源文件夾中創建了一個序列化文件。 我還需要從/向它讀取和寫入序列化數據。

我設法在桌面上工作,但不是在 android 上。 因為我猜它有不同的文件結構。 這就是我嘗試動態獲取文件路徑的原因。

在運行之前創建(且未修改)的現有資源文件似乎在兩個平台上都可以正常工作。

我嘗試使用new File("src/main/resources/folder/file.ser").getAbsolutePath(); 並嘗試從我的根文件夾訪問它,如下所示: getClass.getResources("/folder/file.ser").getPath(); . 它們都可以在桌面(Windows)上正常工作,但不幸的是 Android 沒有通過文件路徑找到文件。

另一個問題可能是我不應該在資源文件夾中創建運行時文件,但我應該在哪里創建?

知道如何讀取和寫入在 android 和桌面上都可以使用的運行時創建的文件嗎?

(如果信息不足以幫助我,我會嘗試以最小形式重現我的代碼並提供更多詳細信息。)

我認為你在一個完全錯誤的軌道上。 在資源文件夾中創建或寫入文件通常不起作用。 這個想法是資源文件夾中的文件被打包成 jar 文件或以其他方式與應用程序捆綁在一起並且在運行時不可寫。

您應該做的是在您的程序第一次啟動時創建一個應用程序文件夾。 例如,桌面上的常見做法是在用戶主目錄中創建一個不可見的文件夾“.myApp”。 在 Android 等其他平台上,還有其他特定於平台的命名和位置規則,但概念是相同的。 在首次啟動時,您還可以將資源文件夾中的必要資源復制到此應用程序文件夾中,以便您可以在運行時對其進行編輯。

路徑上具有路徑的資源文件可以打包在 jar 中並且應該被視為只讀的,尤其是在某些情況下資源可能會被緩存。 它們不是File 它們可以通過 URL、URI、Path 來捕獲。 路徑區分大小寫,路徑分隔符為/

因此資源只能用作模板,一個初始文件。 它們應該被復制到應用程序之外的真實文件中。

Path path = Paths.get(System.getProperty("user.home"), ".myapp/file.ser");
Files.createDirectories(path.getParent());
if (Files.exists(path)) {
    URL url = MyClass.class.getResource("/folder/file.ser");
    Path template = Paths.get(url.toURI());

    Files.copy(template, path);
}

此外.ser ,一個序列化的 java 對象,不是一個好主意。 我建議使用帶有注釋的 JAXB 的 XML。 更具可讀性、可維護性、可版本化。 在您的位置開發 JRE 與在客戶端部署 JRE 之間沒有沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM