Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何复制文件夹';运行时和开发环境中jar的资源都用完了吗?_Java_File Io_Java 8_Game Development - Fatal编程技术网

Java 如何复制文件夹';运行时和开发环境中jar的资源都用完了吗?

Java 如何复制文件夹';运行时和开发环境中jar的资源都用完了吗?,java,file-io,java-8,game-development,Java,File Io,Java 8,Game Development,我目前正在制作一个游戏,它有预先制作好的关卡,我现在将它们存储在资源中。我想要一个在生产和开发环境中如何从jar中提取文件夹的解决方案 我尝试使用下面给定的方法复制文件夹,并将src作为File defaultWorld=new File(GameData.class.getClassLoader().getResource(“worlds/”).getFile()传递 目标为私有静态文件worldsDir=new文件(“run/worlds”) 我希望上面的方法可以在dev和productio

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

我尝试使用下面给定的方法复制文件夹,并将src作为
File defaultWorld=new File(GameData.class.getClassLoader().getResource(“worlds/”).getFile()传递
目标为
私有静态文件worldsDir=new文件(“run/worlds”)

我希望上面的方法可以在dev和production env上使用,但在打开文件输出流时,它会抛出
FileNotFoundException

您不能在jar中列出资源

你想到的任何解决办法都是不可靠的

  • 永远不要调用URL的
    getFile()
    方法。它不返回有效的文件名;它只返回URL的路径和查询部分,任何百分比都会原封不动地转义。此外,jar条目不是
    file:
    URL,因此资源路径在引用jar条目时永远不能是有效的文件名
  • 在jar文件中列出内容的唯一方法是迭代所有jar条目,但您甚至不能保证能够访问您的jar,因为类加载器不能保证是URLClassloader,通常也不能保证使用
    jar:
    URL
  • 您甚至不能依赖MyApplication.class.getProtectionDomain().getCodeSource(),因为
如果您想从jar复制多个文件,以下是一些可靠的方法:

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

谢谢,我想第二种方法/答案就是我要做的。谢谢你的详细解释。
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();
    }
}