在Java小程序中加载目录中的所有文件

发布于 2024-08-21 05:45:42 字数 597 浏览 8 评论 0原文

如何以编程方式加载小程序的 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++;
}

我知道我可能缺少一些明显的功能,但我花了几个小时搜索教程和文档,寻找在未签名的小程序中执行此操作的简单方法。

How would one go about programatically loading all the resource files in a given directory in a JAR file for an applet? The resources will probably change several times over the lifetime of the program so I don't want to hardcode names in.

Normally I would just traverse the directory structure using File.list(), but I get permission issues when trying to do that within an applet. I also looked at using an enumeration with something line ClassLoader.getResources() but it only finds files of the same name within the JAR file.

Essentially what I want to do is (something like) this:

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++;
}

I know I'm probably missing some obvious function, but I've spent hours searching through tutorials and documentation for a simple way to do this within an unsigned applet.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

守望孤独 2024-08-28 05:45:42

您可以通过两种方式完成此操作:

  1. 重命名图像,以便您可以通过某种算法枚举它们(例如 image_1image_2image_3),然后你就可以一次性收集你需要的所有资源。
  2. 否则你需要编写大量代码。这个想法是你必须:

    • 确定 JAR 文件的路径:

      private static Final String ANCHOR_NAME = "你知道的一些资源";
      
      URL 位置 = getClass().getClassLoader().getResource(ANCHOR_NAME);
      URL jar位置;
      字符串协议 = location.getProtocol();
      if (协议.equalsIgnoreCase("jar"))
      {
          字符串路径 = location.getPath();
          int index = path.lastIndexOf("!/" + ANCHOR_NAME);
          if(索引!= -1)
             jarLocation = 新 URL(path.substring(0, 索引));
      }
      if (protocol.equalsIgnoreCase("文件"))
      {
          String string = location.toString();
          int index = string.lastIndexOf(ANCHOR_NAME);
          if(索引!= -1)
              jarLocation = 新 URL(string.substring(0, 索引));
      }
      
    • 将其打开为java.util.jar.JarFile

      JarFile jarFile = new JarFile(jarLocation);
      
    • 迭代所有条目并将其名称与给定掩码进行匹配

      for (枚举条目 = jarFile.entries();条目.hasMoreElements();)
      {
           JarEntry 条目 = (JarEntry)条目.nextElement();
           字符串entryPath=entry.getName();
           if (entryPath.endsWith(".jpg"))
           {
              // 用它做一些事情
           }
      }
      

对于其他代码支持,我将向您推荐 Spring PathMatchingResourcePatternResolver#doFindPathMatchingJarResources()

You can do it in two ways:

  1. Rename your images, so you can enumerate them via some algorithm (e.g. image_1, image_2, image_3), then you can collect all resources you need in one go.
  2. Otherwise you need to code a lot. The idea is that you have to:

    • determine the path to your JAR file:

      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));
      }
      
    • open it as java.util.jar.JarFile

      JarFile jarFile = new JarFile(jarLocation);
      
    • iterate through all entries and match their name with a given mask

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

For additional code support, I will refer you to Spring PathMatchingResourcePatternResolver#doFindPathMatchingJarResources().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文