jar文件中的媒体文件夹

时间:2011-12-30 17:06:39

标签: java jar 2d media

之前提出过这个问题,我已经搜索了很多答案。它始终以“你想要getResourceAsStream”结尾。这不是我要找的。

我的问题是,对于一个游戏对象,我使用文件夹结构来保持精灵条而不是一个大的精灵。这导致:

媒体/ 角色名字/ AnimationName / image.extension

编程对象只是将它的文件夹保存为字符串,然后将getResource()URL传递给对象以填充图像映射。可以有{n}个动画名称/子目录。我的错误来自此代码:

dir = new File(s.toURI());

我获取目录,并调用listFiles并将找到的文件名传递给sprite loader。这是一段代码:

    dir = new File(s.toURI());
    File[] chld = dir.listFiles();
    //get a list of files in the image/character folder
    for(File f:chld)
    {
        //get a list of the files for each dir
        File[] grandChild = f.listFiles();
        for(File t:grandChild)
        {
             String fname = t.getAbsolutePath();
             System.out.println(fname);
             String temp = fname;
             temp = temp.substring(temp.lastIndexOf("/") + 1,temp.lastIndexOf("."));
             String animName = temp.replaceAll("\\d*$", "");
             int numPics = 0;
             Pattern p = Pattern.compile("[0-9]+");
             Matcher m = p.matcher(temp);
             while(m.find()){
                 numPics = Integer.parseInt(m.group());
             }
             System.out.println("animation name: " + animName);
             System.out.println("file name: " + fname);
             System.out.println("number of pictures: " + numPics);
            Animations.put(animName, sl.loadStripImageArray(fname, numPics));
        }
    }

请原谅不良的命名和临时变量,它仍在继续工作。

sl是sprite加载器,Animations是一个哈希映射。这工作正常,直到我打包项目。我不想编写一堆复杂的代码,只有在我有一个jar文件时才能工作,而不是在我使用源文件夹的netbeans工作时。

我考虑过拥有一个应用程序数据文件夹,但如果可以的话,我想继续使用jar包。

2 个答案:

答案 0 :(得分:1)

执行仍希望使用getResourceAsStream。这里没有任何要求所有资源必须保存在JAR中的同一文件夹中。您可以通过在路径前加/前缀来使用相对路径或绝对路径到JAR的根目录。

您无法使File使用JAR中的资源 - 即使使用指向JAR中包含的资源的URL进行实例化。

您可能必须重做其他一些事情,因为类路径实际上并不是要枚举(因为您当前列出了父目录中的文件)。它旨在按名称检索资源。所以一种可能性(我建议)是有一个“清单”文件,其中包含要从每个目录加载的文件。 (读取此文件,然后按名称加载其他资源。)

或者,如果您可以找到要加载的JAR文件的名称,则可以从中创建Jarfile,然后调用其entries()方法查找所有包含的资源。但即便如此,它们也不是以“树结构”返回的,所以理想情况下,你会读到这个,从它创建自己的树结构(可能是一系列地图),然后用它来检索“目录”列表“根据需要。

答案 1 :(得分:0)

如果您完全确定精灵位于jar中 - 您可以尝试使用JarFile类。方法entries。我没有尝试,但似乎返回位于整个jar文件中的所有资源。您必须过滤掉正确路径中的资源。