java - 如何读取 jar 文件,将其转换为字符串并从该字符串创建新的 jar 文件?

标签 java jar osgi

我正在尝试为 OSGi 包实现一些“无线”更新机制。为此,我需要能够从字符串创建一个 jar 文件(基本上是 JarInputStream 读取的 jar 文件的内容)。以下示例代码应该可以说明我的需求:

                //read bundle to be copied!
                File originalFile = new File(
                        "/Users/stefan/Documents/Projects/OSGi/SimpleBundle_1.0.0.201404.jar");
                JarInputStream fis = new JarInputStream(new FileInputStream(originalFile));
                StringBuilder stringBuilder = new StringBuilder();
                int ch;
                while ((ch = fis.read()) != -1) {
                    stringBuilder.append((char) ch);
                }

                fis.close();

                //Create content string
                String content = stringBuilder.toString();
                if (logger.isInfoEnabled()) {
                    logger.info(content);
                }

                //Init new jar input stream
                JarInputStream jarInputStream = new JarInputStream(
                        new ByteArrayInputStream(content.getBytes()));

                if (logger.isInfoEnabled()) {
                    logger.info("Save content to disc!");
                }

                File newFile = new File(
                        "/Users/stefan/Documents/Projects/OSGi/equinox/SimpleBundle_1.0.0.201404.jar");
                //Init new jar output stream
                JarOutputStream fos = new JarOutputStream(
                        new FileOutputStream(newFile));

                if (!newFile.exists()) {
                    newFile.createNewFile();
                }

                int BUFFER_SIZE = 10240;
                byte buffer[] = new byte[BUFFER_SIZE];

                while (true) {

                    int nRead = jarInputStream.read(buffer, 0,
                            buffer.length);
                    if (nRead <= 0)
                        break;

                    fos.write(buffer, 0, nRead);
                }

                //Write content to new jar file.
                fos.flush();
                fos.close();
                jarInputStream.close();

不幸的是,创建的 jar 文件是空的,如果我尝试使用 JD-GUI 打开它,则会抛出“无效的输入文件”错误。是否可以从字符串“content”创建 jar 文件?

最诚挚的问候,非常感谢 斯特凡

最佳答案

您的 jar 是空的,因为您没有从 JarInputStream 中读取任何内容。如果你想读取 JarInputStream,你应该迭代它的条目。如果要更改 Manifest,应跳过第一个条目,使用 jarInputStream 的 getManifest() 和 JarOutputStream 的构造函数,其中可以指定 Manifest。基于您的代码(没有 list 更改,而是普通的 jar 副本):

ZipEntry zipEntry = jarInputStream.getNextEntry();
while (zipEntry != null) {
    fos.putNextEntry(zipEntry);

    // Simple stream copy comes here
    int BUFFER_SIZE = 10240;
    byte buffer[] = new byte[BUFFER_SIZE];
    int l = jarInputStream.read(buffer);
    while(l >= 0) {
        fos.write(buffer, 0, l);
        l = jarInputStream.read(buffer);
    }

    zipEntry = jarInputStream.getNextEntry();
}

仅当您想在复制过程中更改 JAR 文件的内容( list 或条目)时才需要此命令。否则,简单的 InputStream 和 FileOutputStream 将完成这项工作(正如 Tim 所说)。

关于java - 如何读取 jar 文件,将其转换为字符串并从该字符串创建新的 jar 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23313854/

相关文章:

java - 构造函数与 Java 中的普通方法有何不同?

java - 使用 JNI 在 .jar 中查找 Java 类

groovy - jar文件如何读取自己的资源文件?

grails - Grails在jar中找不到类

eclipse - Maven 与 OSGI 和非 OSGI 项目

java - 用于使用 SOAP - WSDL 的命令行 java 客户端

java - 将 jar 文件放在供应商/目录中并将其添加到 git 存储库是个坏主意吗?

java - 在异步任务上或异步任务中执行多个任务,并从 postexecute 返回数据

java - Apache Felix OSGi 错误 : missing requirement osgi. 扩展程序

spring - 使用 TX :annotation-driven prevents Autowiring a bean