Получение списка файлов внутри JAR-файла Java-апплета - PullRequest
1 голос
/ 09 января 2012

Я пытаюсь получить список файлов, используя метод, который, очевидно, хорошо работает с не апплетным кодом Java.

Я полностью осознаю, что это грязно; Я просто пытаюсь заставить это работать для школьного задания. (Я не фанат Java.)

        CodeSource src = MemoryButtonHelper.class.getProtectionDomain().getCodeSource();
        if (src == null) {
            throw new Exception();
        }

        URL jar = src.getLocation();
        System.out.println("Loading from " + jar);

        JarFile zf=new JarFile(jar.toString()); //jar.openStream());

        final Enumeration<JarEntry> entries = zf.entries();

        while (entries.hasMoreElements()) {
            final JarEntry ze = entries.nextElement();

            if(ze.getName().endsWith(".jpg") || ze.getName().endsWith(".png"))
            {
                System.out.println("Adding " + ze.getName());
                slikeList.add(ze.getName());
            }
        }
        zf.close();

К сожалению, я получаю исключение безопасности.

java.security.AccessControlException: access denied (java.lang.RuntimePermission getProtectionDomain)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.Class.getProtectionDomain(Class.java:2106)
    at hr.tvz.programiranje.java.deseti.helpers.MemoryButtonHelper.getSlike(MemoryButtonHelper.java:75)
        … ad nauseam … 

Согласно Java Console, исключение возникает до println("Loading from " + jar).

Это присвоение бонусных баллов, в котором конкретно сказано, что мы должны получить список изображений из файла JAR. Так как это мое первое знакомство с апплетами, я не уверен, что могу сделать, чтобы получить список изображений.

Ответы [ 3 ]

2 голосов
/ 09 января 2012

.. мы должны получить список изображений из файла JAR.

Кто их туда поместил?Если ответ «мы сделали», решение простое.

  • Включите список путей / имен изображений в известном месте (например, images/imagelist.txt) в Jar.
  • Получите ссылку на список, используя getResource(String).
  • Чтение списка (возможно, с использованием средства чтения строк).

Очевидно, они хотят, чтобы я перечислил содержимое банки без изменений, без дополнительных метаданных.

ОК.Если вы можете сформировать URL (и, следовательно, InputStream из) Zip-файла, можно установить ZipInputStream из него.Это должно работать независимо от того, является ли URL-адрес Zip / Jar, кэшированным в локальной файловой системе, или , все еще на сервере.

  1. Получить URL-адрес для Jar.
  2. Установите ZipInputStream из URL.
  3. Итерируйте записи, используя getNextEntry() до null
  4. Изучите каждое из них на предмет возможного совпадения, и еслиэто так, добавьте его в ArrayList.

Конечно, вам все еще понадобится подписанный и доверенный код для вызова домена защиты.


Изображения определенно находятся в одном и том же JAR

Чтобы получить URL-адрес для Jar, попробуйте это (не проверено).Предположим, что апплет com.our.BookingApplet.

  1. Получите URL-адрес Jar-файла, в котором находится класс, используя
    URL urlToApplet = this.getClass().getResource("/com/our/BookingApplet.class")
  2. String[] parts = urlToApplet.toString().split("!"), чтобы получить две частипервым будет String представление URL-адреса Jar.
  3. Используйте это String для установки URL, затем используйте URL, как описано в предыдущем обновлении.
1 голос
/ 14 января 2012

Спасибо Эндрю Томпсону за его отличный ответ ! Определенно, вместо этого (или в дополнение) положите ответ на этот вопрос, так как без его помощи я бы не смог этого понять.

Вот часть кода, которую я придумал, чтобы использовать для получения списка файлов .jpg и .png внутри файла JAR. Обратите внимание, что вам, вероятно, нужно изменить имя пакета, в котором хранится класс MemoryGame, а также изменить имя самого класса.

        List<String> slikeList = new ArrayList<String>();

        URL urlToApplet = MemoryGame.class.getResource("/com/whoever/whatever/gui/MemoryGame.class");
        String[] parts = urlToApplet.toString().split("!");
        String jarURLString = parts[0].replace("jar:", "");
        System.out.println("Loading from " + jarURLString);

        URL jar = new URL(jarURLString);

        URLConnection jarConnection = jar.openConnection();
        JarInputStream jis = new JarInputStream(jarConnection.getInputStream());

        JarEntry je = jis.getNextJarEntry();
        while(je != null)
        {
            System.out.println("Inspecting " + je);
            if(je.getName().endsWith(".jpg") || je.getName().endsWith(".png"))
            {
                System.out.println("Adding " + je.getName());
                slikeList.add(je.getName());
            }
            je = jis.getNextJarEntry();
        }

Если вам интересно, slike означает images на хорватском, поскольку многие переменные, названные в спецификации упражнения, на хорватском.

0 голосов
/ 09 января 2012

Только «подписанные» апплеты имеют доступ к файловой системе. Если файл jar, с которого вы читаете, находится в вашей локальной файловой системе, вам сначала нужно будет подписать апплет.

См. эту ссылку для получения дополнительной информации о том, как подписать апплет.

...