我目前正在制作一款具有預制關卡的游戲,目前我將它們存儲在資源中。我想要一個解決方案,以解決如何在生產和開發環境中從 jar 中提取文件夾的問題。我嘗試使用下面給定的方法復制文件夾并將 src asFile defaultWorld = new File(GameData.class.getClassLoader().getResource("worlds/").getFile()); 和 destination as傳遞private static File worldsDir = new File("run/worlds");public static void copyFolder(File src, File dest) { try { if (src.isDirectory()) { if (!dest.exists()) { dest.mkdir(); } String[] files = src.list(); for (String file : files) { copyFolder(new File(src, file), new File(dest, file)); } } else { try (InputStream in = new FileInputStream(src)) { try (OutputStream out = new FileOutputStream(dest)) { byte[] buffer = new byte[1024]; int length; //copy the file content in bytes while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } } } } } catch (IOException e) { e.printStackTrace(); }}我希望上述方法適用于開發環境和生產環境,但FileNotFoundException在打開文件輸出流時會拋出。
1 回答

神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
您不能列出 jar 中的資源。
您正在考慮的任何解決方法都是不可靠的。
永遠不要調用
getFile()
URL 的方法。它不返回有效的文件名;它只返回 URL 的路徑和查詢部分,任何百分比轉義都完好無損。此外,jar 條目不是file:
URL,因此資源路徑在引用 jar 條目時永遠不可能是有效的文件名。在 jar 文件中列出內容的唯一方法是遍歷所有 jar 條目,但您甚至不能保證可以訪問您的 jar,因為不能保證 ClassLoaders 是 URLClassLoaders,并且通常不能保證使用
jar:
URL .您甚至不能依賴 MyApplication.class.getProtectionDomain().getCodeSource(),因為getCodeSource() 可以返回 null。
如果你想從你的 jar 中復制多個文件,這里有一些可靠的方法:
硬編碼您計劃復制的資源列表。這是您的應用程序,因此您知道要放入 jar 中的文件。
在您的 jar 中保留一個文本文件,其中包含要復制的資源路徑列表。
將您的資源存儲在嵌入在您的 jar 中的單個 zip 存檔中,并使用包裝 MyApplication.class.getResourceAsStream的ZipInputStream 自行提取它。
添加回答
舉報
0/150
提交
取消