为了账号安全,请及时绑定邮箱和手机立即绑定

如何在运行时和 dev-env 中从 jar 中复制文件夹的资源?

如何在运行时和 dev-env 中从 jar 中复制文件夹的资源?

喵喵时光机 2022-11-30 16:58:04
我目前正在制作一款具有预制关卡的游戏,目前我将它们存储在资源中。我想要一个解决方案,以解决如何在生产和开发环境中从 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 自行提取它。


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信