读取JAR文件的内容(在运行时)?

时间:2009-09-22 23:35:47

标签: api jar java

我已阅读帖子:

Viewing contents of a .jar file

How do I list the files inside a JAR file?

但遗憾的是,我无法找到一个好的解决方案来实际读取 JAR的内容(逐个文件)。

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

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

3 个答案:

答案 0 :(得分:8)

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

查看教程here

答案 1 :(得分:3)

以下是我将其作为ZIP文件阅读的方式,

   try {
        ZipInputStream is = new ZipInputStream(new FileInptuStream("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方法更有效。

答案 2 :(得分:2)

这是完整的代码,它读取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);
            }
        }
    }
}