关于api:读取JAR文件的内容(在运行时)?

 2020-05-11 

Reading content of a JAR file (at runtime)?

本问题已经有最佳答案,请猛点这里访问。

我已阅读以下帖子:

查看.jar文件的内容

如何在JAR文件中列出文件?

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

此外,有人可以给我提示或指向讨论我的问题的资源吗?

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


您使用JarFile打开一个Jar文件。 有了它,您可以通过使用'getEntry(String name)'或'entires'获得ZipEntry或JarEntry(它们可以看作同一东西)。 收到条目后,可以通过调用" JarFile.getInputStream(ZipEntry ze)"将其用于获取InputStream。 好了,您可以从流中读取数据。

在此处查看教程。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   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方法更有效。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
            }
        }
    }
}