Медиа-папка в jar-файле - PullRequest
       6

Медиа-папка в jar-файле

3 голосов
/ 30 декабря 2011

Этот вопрос был поднят ранее, и я искал многие ответы. Он всегда заканчивается на «Вы хотите getResourceAsStream». Это не то, что я ищу.

Моя проблема заключается в том, что для игрового объекта я использую структуру папок, чтобы сохранить полосы спрайтов, а не иметь один большой спрайт. В результате:

Медиа / Название характера/ AnimationName / image.extension

программный объект просто хранит свою папку в виде строки, и я передаю URL-адрес getResource () объекту, чтобы заполнить карту изображений. может быть {n} число каталогов AnimationName / sub. Моя ошибка исходит из этого кода:

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

Я беру каталог, вызываю listFiles и передаю найденные имена файлов загрузчику спрайтов. Вот фрагмент кода:

    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 - загрузчик спрайтов, а Animations - хэш-карта. Это работает нормально, пока я не упакую проект. Я не хочу писать кучу сложного кода, который работает, только если у меня есть JAR-файл, а не когда я работаю в NetBeans с исходными папками.

Я рассмотрел наличие папки с данными приложения, но я хотел бы остаться с пакетом jar, если смогу.

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Вы делаете все еще хотите использовать getResourceAsStream. Ничто здесь не требует, чтобы все ресурсы находились в одной папке внутри JAR. Вы можете использовать относительные пути или абсолютные пути к корню JAR, добавив префикс вашего пути к /.

Нельзя заставить File работать с ресурсами в JAR - даже если создается экземпляр с URL-адресом, указывающим на ресурс, содержащийся в JAR.

Возможно, вам придется переделать некоторые другие вещи, поскольку путь к классу на самом деле не предназначен для перечисления (так как вы в настоящее время перечисляете файлы из родительского каталога). Он предназначен для извлечения ресурса по имени. Таким образом, одна возможность (которую я бы порекомендовал) - это иметь файл "манифеста", содержащий файлы, которые вы хотите загрузить из каждого каталога. (Прочтите этот файл, затем загрузите дополнительные ресурсы по имени.)

В качестве альтернативы, если вы можете найти имя файла JAR, из которого вы загружаете, вы можете создать из него Jarfile, а затем вызвать его метод entries() найти все содержащиеся ресурсы. Но даже в этом случае они не возвращаются в виде «древовидной структуры», поэтому в идеале вы должны прочитать этот документ, создать из него свою собственную древовидную структуру (возможно, в виде серии карт), а затем использовать ее для извлечения «каталога». списки "по мере необходимости.

0 голосов
/ 30 декабря 2011

Если вы абсолютно уверены, что спрайты находятся в банке - вы можете попробовать использовать класс JarFile. Есть метод записей . Я не пробовал, но, похоже, он возвращает все ресурсы, находящиеся во всем jar-файле. Вам нужно будет отфильтровать, какие ресурсы находятся на правильном пути.

...