Java库来操作jar文件

时间:2012-08-28 17:59:29

标签: java jar

有人可以推荐使用Java库来操作 jar 文件吗?我发现 java.util.jar 提供的设施相当简洁(或者我可能没有一些示例代码可供查看)。我对以下内容感兴趣:

  1. 将文件添加到 jar
  2. jar
  3. 中删除文件
  4. 从文件夹
  5. 创建 jar 文件
  6. jar 文件放缩到文件夹
  7. 阅读 jar条目的内容(可能在内存中,无需在磁盘上放下 jar
  8. 在内存中创建 jar条目,而无需从磁盘上的文件中读取。
  9. 询问 jar 文件条目是 Manifest 文件还是其他特殊文件。
  10. 如果有人可以使用 java.util.jar 或其他一些有用的库指向示例代码。特别是在查看 java.util.jar 的类和方法时,我不清楚如何读取特定Jar条目的内容,甚至不知道如何缩小 jar (不产生外部过程)。

4 个答案:

答案 0 :(得分:2)

一个jar只是一个zip file with a different extension(和一个清单),所以你可能会对像zip4jjava.util.zip这样的zip库感兴趣。

答案 1 :(得分:2)

1& 2是简单的手动操作,将条目从Jar复制到另一个添加或留下您想要的条目,删除原始文件并重命名新文件以替换它。

正如jtahlbom指出的那样,Java Jar API可以开箱即用。

更新示例

这些是非常基本的例子。它们向您展示如何读取和编写Jar。基本上,你可以从中得到你需要做的其他事情。

我已经设置了一个个人图书馆(不包括在内),它基本上允许我传入InputStream并将其写入OutputStream,反之亦然。这意味着您可以从任何地方读取并写入任何地方,这可以满足您的大多数要求。

public void unjar(File jar, File outputPath) throws IOException {
    JarFile jarFile = null;
    try {
        if (outputPath.exits() || outputPathFile.mkdirs()) {
            jarFile = new JarFile(jar);
            Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                JarEntry entry = entries.nextElement();
                File path = new File(outputPath + File.separator + entry.getName());
                if (entry.isDirectory()) {
                    if (!path.exists() && !path.mkdirs()) {
                        throw new IOException("Failed to create output path " + path);
                    }
                } else {
                    System.out.println("Extracting " + path);

                    InputStream is = null;
                    OutputStream os = null;
                    try {
                        is = jarFile.getInputStream(entry);
                        os = new FileOutputStream(path);

                        byte[] byteBuffer = new byte[1024];
                        int bytesRead = -1;
                        while ((bytesRead = is.read(byteBuffer)) != -1) {
                            os.write(byteBuffer, 0, bytesRead);
                        }
                        os.flush();
                    } finally {
                        try {
                            os.close();
                        } catch (Exception e) {
                        }
                        try {
                            is.close();
                        } catch (Exception e) {
                        }
                    }
                }
            }
        } else {
            throw IOException("Output path does not exist/could not be created");
        }
    } finally {
        try {
            jarFile.close();
        } catch (Exception e) {
        }
    }
}

public void jar(File jar, File sourcePath) throws IOException {
    JarOutputStream jos = null;
    try {
        jos = new JarOutputStream(new FileOutputStream(jar));

        List<File> fileList = getFiles(sourcePath);
        System.out.println("Jaring " + fileList.size() + " files");

        List<String> lstPaths = new ArrayList<String>(25);
        for (File file : fileList) {
            String path = file.getParent().replace("\\", "/");
            String name = file.getName();

            path = path.substring(sourcePath.getPath().length());
            if (path.startsWith("/")) {
                path = path.substring(1);
            }

            if (path.length() > 0) {
                path += "/";
                if (!lstPaths.contains(path)) {
                    JarEntry entry = new JarEntry(path);
                    jos.putNextEntry(entry);
                    jos.closeEntry();
                    lstPaths.add(path);
                }
            }

            System.out.println("Adding " + path + name);

            JarEntry entry = new JarEntry(path + name);
            jos.putNextEntry(entry);

            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);
                byte[] byteBuffer = new byte[1024];
                int bytesRead = -1;
                while ((bytesRead = fis.read(byteBuffer)) != -1) {
                    jos.write(byteBuffer, 0, bytesRead);
                }
                jos.flush();
            } finally {
                try {
                    fis.close();
                } catch (Exception e) {
                }
            }
            jos.closeEntry();
        }
        jos.flush();
    } finally {
        try {
            jos.close();
        } catch (Exception e) {
        }
    }
}

如果你花点时间看一下,有很多关于如何在SO上添加/删除来自zip / jar文件的条目的例子

答案 2 :(得分:1)

TrueZip似乎是一个非常全面的zip库。

顺便说一句,我很确定jdk jar API可以很容易地处理3-7。

答案 3 :(得分:0)

也许Apache Commons Compress可以帮到你。