当前位置: 首页 > 面试题库 >

Java库来操作jar文件

易成双
2023-03-14
问题内容

谁能推荐Java库来操作 jar 文件?我在 java.util.jar上
找到的工具比较简洁(或者也许我没有看一些示例代码)。我对诸如此类的东西感兴趣:

  1. 将文件添加到 罐子中
  2. 罐子中* 删除文件 *
  3. 从文件夹创建一个 jar 文件
  4. jar 文件放到文件夹中
  5. 读取 jar条目 的内容(也许在内存中,而不必缩小磁盘上的 jar
  6. 在内存中创建 jar条目 ,而不必从磁盘上的文件中读取。
  7. 询问 jar 文件条目是 清单 文件还是其他一些特殊文件。

如果任何人都可以使用 java.util.jar 或其他有用的库来指向示例代码。尤其是查看 java.util.jar
的类和方法时,我不清楚如何读取特定Jar条目的内容,甚至不知道如何缩小 Jar (不产生外部进程)。


问题答案:

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文件中添加/删除条目。



 类似资料:
  • 在这个问题中,我必须调用一个第三方Java库,该库期望,其结果来自Scala例程返回。 我会将Scala-Future封装到一个新的Java-Future中,但是没有办法实现Java-Future方法< code > def cancel(mayinterruptirunning:Boolean):Boolean ,因为它会中断封装的Scala-Future(否则请告诉我)。 我该如何解决这个问题

  • 本文向大家介绍Java中的数据库操作,包括了Java中的数据库操作的使用技巧和注意事项,需要的朋友参考一下 本文提供了有关如何创建简单JDBC应用程序的示例。这将向您展示如何打开数据库连接,执行SQL查询以及显示结果。 创建JDBC应用程序 构建JDBC应用程序涉及以下六个步骤- 导入软件包:要求您包含包含数据库编程所需的JDBC类的软件包。通常,使用import java.sql。*就足够了。

  • 我需要安装一个JAR文件作为库,同时设置数据库群集作为Azure发布管道的一部分。到目前为止,我已经完成了以下工作- 使用Azure CLI任务创建群集定义 使用curl命令将JAR文件从Maven仓库下载到管道代理文件夹 在管道代理上设置数据库CLI 使用将JAR文件从本地(管道代理)目录复制到dbfs:/FileStore/jars文件夹 我正在尝试创建一个集群范围的init脚本(bash)脚

  • 目录其本质也是一种文件,它的r权限是ls,x权限是cd DIR结构体 Unix系统为用户提供了一种和文件结构FILE类似的目录结构DIR。它被称为目录流,目录中的目录项用dirent结构表示(但DIR的并非包含dirent成员) dirent结构 结构体成员 类型 描述 d_into ino_t 文件的inode号 d_name[ ] char 以NULL结尾的文件名 常用函数(库调用) 函数名

  • 我开发了一个简单的代码,通过在实体类“employee”和“Department”上使用JPA的CRUD操作(find)来显示员工姓名。在运行代码时,它工作正常,但真正的问题来了,当我从应用程序创建一个jar文件时,jar文件出现了一个异常,我将该异常写在一个txt文件中 下面是Employee类 下面是显示员工姓名和学位的类 下面是异常“exception[EclipseLink-28019](

  • 我正在尝试将我从eclipse制作的pacman游戏导出到。罐子包装。问题是,尽管eclipse上的一切都运行良好,但当。jar已导出,我使用的资源无法正确加载。我将它们放在一个单独的/res文件夹中,该文件夹位于构建路径上。我通过以下方式访问它们: 我做错了什么?这里是我得到的错误的一个例子(只有在eclipse上导出的. jar中运行良好)