获取Java applet的JAR中的文件列表

时间:2012-01-09 11:10:06

标签: java jar applet

我正在尝试使用一种显然适用于非applet 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控制台,异常似乎发生在println("Loading from " + jar)

之前

这是一个奖励积分,具体说明我们必须从JAR文件中获取图像列表。由于这是我第一次遇到小程序,我不知道如何才能获取图像列表。

3 个答案:

答案 0 :(得分:2)

  

..我们必须从JAR文件中获取图像列表。

谁把它们放在那里?如果答案是“我们做了”,解决方案很简单。

  • 在Jar中的已知位置(例如images/imagelist.txt)添加图像路径/名称列表。
  • 使用getResource(String)获取对列表的引用。
  • 阅读清单(可能使用行读者)。

  

显然他们希望我按原样列出jar的内容,而不需要额外的元数据。

行。如果您可以在Zip文件中形成一个URL(从而形成InputStream),则可以从中建立ZipInputStream。无论URL是否仍在服务器上的本地文件系统上缓存的Zip / Jar,这都应该有效。

  1. 获取Jar的URL。
  2. 从网址
  3. 建立ZipInputStream
  4. 使用getNextEntry()迭代条目,直到null
  5. 检查每一个是否有匹配,如果是,请将其添加到ArrayList
  6. 当然,你还需要签名&amp;用于调用保护域的可信代码。


      

    图像肯定在同一个JAR中

    要获取Jar的URL,请尝试此操作(未经测试)。我们假设applet是com.our.BookingApplet

    1. 使用
      获取类所在的Jar的URL URL urlToApplet = this.getClass().getResource("/com/our/BookingApplet.class")
    2. String[] parts = urlToApplet.toString().split("!")将提供两部分,第一部分将是Jar网址的String表示。
    3. 使用String建立URL,然后按照上一次更新中的说明使用URL

答案 1 :(得分:1)

感谢Andrew Thompson的excellent answer!绝对赞成(或另外)对这个问题的答案,因为没有他的帮助,我将无法弄清楚这一点。

以下是我提出的用于获取JAR文件中.jpg.png文件列表的代码部分。请注意,您可能需要更改存储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,因为练习规范中指定的许多变量都是克罗地亚语。

答案 2 :(得分:0)

只允许“已签名”的小程序访问文件系统。如果您正在读取的jar文件位于本地文件系统上,则需要先对该applet进行签名。

有关如何对小程序进行签名的详细信息,请参阅this链接。