gpt4 book ai didi

java - 如何在运行时和开发环境中从 jar 中复制文件夹的资源?

转载 作者:太空宇宙 更新时间:2023-11-04 09:38:58 25 4
gpt4 key购买 nike

我目前正在制作一款游戏,其中有预先制作的关卡,并且我目前将它们存储在资源中。我想要一个解决方案,如何在生产和开发环境中从 jar 中提取文件夹。

我尝试使用下面给定的方法复制文件夹,并将 src 传递为 File defaultWorld = new File(GameData.class.getClassLoader().getResource("worlds/").getFile());目的地为 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

最佳答案

无法列出 jar 中的资源。

您想到的任何解决方法都是不可靠的。

  • 切勿调用 URL 的 getFile() 方法。它返回有效的文件名;它只返回 URL 的路径和查询部分,任何百分比转义都完好无损。此外,jar 条目不是 file: URL,因此资源路径在引用 jar 条目时永远不可能是有效的文件名。
  • 列出 jar 文件中内容的唯一方法是遍历所有 jar 条目,但您甚至不能保证能够访问您的 jar,因为不能保证 ClassLoader 是 URLClassLoader,并且通常不能保证使用 jar: URL。
  • 您甚至不能依赖 MyApplication.class.getProtectionDomain().getCodeSource(),因为 getCodeSource() can return null.

如果您想从 jar 中复制多个文件,这里有一些可靠的方法:

  • 对您计划复制的资源列表进行硬编码。这是您的应用程序,因此您知道要放入 jar 中的文件。
  • 在 jar 中保留一个文本文件,其中包含要复制的资源路径列表。
  • 将您的资源存储在嵌入到 jar 中的单个 zip 存档中,并使用 ZipInputStream 自行解压。它包装了 MyApplication.class.getResourceAsStream。

关于java - 如何在运行时和开发环境中从 jar 中复制文件夹的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56188427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com