加载Java applet中目录中的所有文件

时间:2010-02-09 18:22:15

标签: java resources applet classpath

如何以编程方式加载applet的JAR文件中给定目录中的所有资源文件?资源可能会在程序的生命周期内多次更改,因此我不想在其中对名称进行硬编码。

通常我会使用File.list()遍历目录结构,但是当我尝试在applet中执行此操作时会遇到权限问题。我还研究了使用类似于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++;
}

我知道我可能错过了一些明显的功能,但我花了几个小时搜索教程和文档,以便在一个未签名的applet中执行此操作。

1 个答案:

答案 0 :(得分:1)

您可以通过两种方式实现:

  1. 重命名您的图片,以便您可以通过某种算法(例如image_1image_2image_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
           }
      }
      
  3. 如需其他代码支持,我会将您推荐给Spring PathMatchingResourcePatternResolver#doFindPathMatchingJarResources()