【问题标题】:Reading content of a JAR file (at runtime)? [duplicate]读取 JAR 文件的内容(在运行时)? [复制]
【发布时间】:2010-11-30 14:18:07
【问题描述】:

我已阅读帖子:

Viewing contents of a .jar file

How do I list the files inside a JAR file?

但遗憾的是,我找不到真正读取 JAR 内容(逐个文件)的好解决方案。

此外,有人可以给我一个提示,或指出一个资源,我的问题是在哪里讨论的?

我只是想出一个不那么直截了当的方法来做到这一点:
我可以以某种方式将 JAR 资源列表转换为 内部 JAR URL,然后我可以使用 openConnection() 打开。

【问题讨论】:

标签: api jar java


【解决方案1】:

您使用JarFile 打开一个Jar 文件。有了它,您可以使用“getEntry(String name)”或“entires”来获取 ZipEntry 或 JarEntry(它们可以被视为同一事物)。一旦你得到一个Entry,你可以通过调用'JarFile.getInputStream(ZipEntry ze)'来使用它来获取InputStream。那么您可以从流中读取数据。

【讨论】:

  • 啊,谢谢!我不知何故完全监督了 JarFile 的 getInputStream!
【解决方案2】:

这是我将其作为 ZIP 文件读取的方式,

   try {
        ZipInputStream is = new ZipInputStream(new FileInputStream("file.jar"));
        ZipEntry ze;

        byte[] buf = new byte[4096];
        int len;

        while ((ze = is.getNextEntry()) != null) {

            System.out.println("----------- " + ze);
            len = ze.getSize();

            // Dump len bytes to the file
            ...
        }
        is.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

如果要解压整个文件,这比 JarFile 方法更有效。

【讨论】:

    【解决方案3】:

    这是读取jar文件中所有文件内容的完整代码。

    public class ListJar {
        private static void process(InputStream input) throws IOException {
            InputStreamReader isr = new InputStreamReader(input);
            BufferedReader reader = new BufferedReader(isr);
            String line;
    
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        }
    
        public static void main(String arg[]) throws IOException {
            JarFile jarFile = new JarFile("/home/bathakarai/gold/click-0.15.jar");
    
            final Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                final JarEntry entry = entries.nextElement();
                if (entry.getName().contains(".")) {
                    System.out.println("File : " + entry.getName());
                    JarEntry fileEntry = jarFile.getJarEntry(entry.getName());
                    InputStream input = jarFile.getInputStream(fileEntry);
                    process(input);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 2019-08-23
      • 2014-07-30
      相关资源
      最近更新 更多