Загрузка всех файлов в каталоге в апплете Java - PullRequest
1 голос
/ 09 февраля 2010

Как можно выполнить программную загрузку всех файлов ресурсов в заданном каталоге в JAR-файле для апплета? Ресурсы, вероятно, будут меняться несколько раз за время существования программы, поэтому я не хочу жестко кодировать имена.

Обычно я бы просто просматривал структуру каталогов с помощью File.list (), но у меня возникали проблемы с разрешениями при попытке сделать это внутри апплета. Я также рассмотрел использование перечисления с чем-то в строке ClassLoader.getResources (), но он находит только файлы с одинаковыми именами в файле JAR.

По сути, я хочу сделать что-то вроде этого:

ClassLoader imagesURL = this.getClass().getClassLoader();
MediaTracker tracker = new MediaTracker(this);
Enumeration<URL> images = imagesURL.getResources("resources/images/image*.gif");
while (images.hasMoreElements()){
    tracker.add(getImage(images.nextElement(), i);
    i++;
}

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

1 Ответ

1 голос
/ 09 февраля 2010

Вы можете сделать это двумя способами:

  1. Переименуйте ваши изображения, чтобы вы могли перечислить их по некоторому алгоритму (например, image_1, image_2, image_3), затем вы сможете собрать все необходимые ресурсы за один раз.
  2. В противном случае вам нужно много кодировать. Идея в том, что вы должны:

    • определите путь к вашему файлу JAR:

      private static final String ANCHOR_NAME = "some resource you know";
      
      URL location = getClass().getClassLoader().getResource(ANCHOR_NAME);
      URL jarLocation;
      String protocol = location.getProtocol();
      if (protocol.equalsIgnoreCase("jar"))
      {
          String path = location.getPath();
          int index = path.lastIndexOf("!/" + ANCHOR_NAME);
          if(index != -1)
             jarLocation = new URL(path.substring(0, index));
      }
      if (protocol.equalsIgnoreCase("file"))
      {
          String string = location.toString();
          int index = string.lastIndexOf(ANCHOR_NAME);
          if(index != -1)
              jarLocation = new URL(string.substring(0, index));
      }
      
    • открыть как java.util.jar.JarFile

      JarFile jarFile = new JarFile(jarLocation);
      
    • перебрать все записи и сопоставить их имя с заданной маской

      for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();)
      {
           JarEntry entry = (JarEntry) entries.nextElement();
           String entryPath = entry.getName();
           if (entryPath.endsWith(".jpg"))
           {
              // do something with it
           }
      }
      

Для дополнительной поддержки кода я отошлю вас к Spring PathMatchingResourcePatternResolver # doFindPathMatchingJarResources () .

...