2012-01-09 3 views
1

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

+0

'getProtectionDomain(). GetCodeSource()' Обновление для системы безопасности в конце 1.5 или в начале 1,6 года. Java теперь предоставляет исходный источник Jar (с сайта) в качестве местоположения Jar для приложений апплетов и JWS , (даже доверенных). Или, более короткая версия. Это не будет работать. –

ответ

2

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

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

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

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

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

  1. Получите URL-адрес Jar.
  2. Укажите адрес ZipInputStream.
  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 представление Jar URL.
  3. Используйте это String, чтобы установить URL, затем используйте URL, как описано в предыдущем обновлении.
+0

Я думал об этом. К сожалению, я не думаю, что это задание требует, чтобы я это сделал. По-видимому, они хотят, чтобы я перечислял содержимое банки как есть, без дополнительных метаданных. –

+0

Изображения, безусловно, находятся в одном JAR. Если я правильно вас понимаю, если я не получу путь к JAR, используя 'getProtectionDomain(). GetCodeSource()', нет никакой проблемы с использованием 'ZipInputStream',' JarInputStream' и др.? –

+0

* «Нет абсолютно никаких проблем» * На нем не должно быть никаких ограничений безопасности *. Другие вопросы, о которых я не говорю. –

0

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

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

+0

То же самое относится к чтению содержимого апплета, хранящегося на HTTP-сервере? –

+0

Спасибо за информацию! Однако, по-видимому, беззнаковые апплеты могут свободно обращаться к содержимому JAR, хранящемуся на HTTP-сервере. Кроме того, даже подписание с «ненадежным» самогенерируемым сертификатом не позволяло апплетам получать доступ, когда он был открыт в браузере из локальной файловой системы. Я также предлагаю http://www-personal.umich.edu/~lsiden/tutorials/signed-applet/signed-applet.html как более читаемый учебник. –

1

Спасибо за Андрея Томпсона за его excellent answer! Определенно поднимите свой ответ вместо (или вдобавок) этого, так как без его помощи я не смогу это понять.

Вот часть кода, который я придумал, чтобы извлечь список из .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 в хорватском так много переменных, указанных в описании упражнений в хорватском.

Смежные вопросы