当前位置: 首页 > 知识库问答 >
问题:

Jar文件可以在不重写整个文件的情况下以编程方式更新吗?

吕晟睿
2023-03-14

可以使用以下命令更新JAR文件中的单个文件:

jar uf TicTacToe.jar images/new.gif

有没有办法以编程方式做到这一点?

如果我使用JarOutputStream,我必须重写整个jar文件,所以我想知道是否有类似的“随机访问”方式来做到这一点。鉴于它可以使用jar工具来完成,我曾期望有一种类似的编程方式来完成它。

共有2个答案

端木阳荣
2023-03-14

是的,如果你使用这个开源库,你也可以用这种方式修改它。

https://truevfs.java.net

public static void main(String args[]) throws IOException{
    File entry = new TFile("c:/tru6413/server/lib/nxps.jar/dir/second.txt");
    Writer writer = new TFileWriter(entry);
    try {
        writer.write(" this is writing into a file inside an archive");         
    } finally {
        writer.close();
    }       
}
朱起运
2023-03-14

可以使用Java 7中提供的Zip文件系统提供程序仅更新JAR文件的一部分:

import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
import java.util.Map;

public class ZipFSPUser {
    public static void main(String [] args) throws Throwable {
        Map<String, String> env = new HashMap<>(); 
        env.put("create", "true");
        // locate file system by using the syntax 
        // defined in java.net.JarURLConnection
        URI uri = URI.create("jar:file:/codeSamples/zipfs/zipfstest.zip");

       try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
            Path externalTxtFile = Paths.get("/codeSamples/zipfs/SomeTextFile.txt");
            Path pathInZipfile = zipfs.getPath("/SomeTextFile.txt");          
            // copy a file into the zip file
            Files.copy( externalTxtFile,pathInZipfile, 
                    StandardCopyOption.REPLACE_EXISTING ); 
        } 
    }
}
 类似资料:
  • 问题内容: 我正在尝试使用Python的ftplib读取文件而不编写它们。大致相当于: 但使用FTP。 我试过了: 但这不起作用。文档中的唯一示例涉及使用该格式编写文件。是否可以在不先写入的情况下读取ftp文件? 问题答案: 好吧,您的答案就在眼前:retrbinary方法接受对函数的引用作为第二个参数,该函数在从ftp连接中检索文件内容时被调用。 这是一个简单的示例: 您应该实现writeFun

  • 问题内容: 我需要以编程方式计算给定jar文件中已编译类,接口和枚举的数量(因此我需要三个单独的数字)。哪个API对我有帮助?(我不能使用第三方库。) 我已经尝试过非常棘手的方案,这似乎并不总是正确的。即,我将每个ZipEntry读入byte [],然后将结果提供给我的自定义类加载器,该加载器扩展了标准CalssLoader并将此byte []发送到ClassLoader.defineClass(

  • 问题内容: 我正在使用嵌套对象(与该帖子相关的用户)为一组文档建立索引(将它们想象为论坛帖子)。我的问题是用户字段可能已更新,但是由于帖子未更改,因此它们未重新索引,并且用户嵌套的对象已过时。有没有一种方法可以更新嵌套对象,而无需再次为整个文档重新编制索引?还是唯一的解决方案是在用户每次更改时重新索引该用户的所有相关帖子? 问题答案: 您可以使用Update API。 需要注意的是更新脚本支持条件

  • 问题内容: 我处理非常大的二进制文件(每个文件从几个GB到多个TB)。这些文件以旧格式存在,并且升级需要将标头写入文件的FRONT。我可以创建一个新文件并重写数据,但是有时这可能需要很长时间。我想知道是否有更快的方法来完成此升级。该平台仅限于Linux,我愿意使用低级功能(ASM,C,C ++)/文件系统技巧来实现这一目标。基本库是Java,JNI是完全可以接受的。 问题答案: 没有本机执行此操作

  • 我可以使用PHP以编程方式更改文件的路径吗? 例如,更改

  • 问题内容: 有一个Java文件,其中包含一些依赖项jar。但是现在,我没有那些jars,必须将其编译为.class文件。 是否有可能做到这一点? 更新 感谢您的回答。 起初,我认为我们可以为缺少的依赖项创建一些存根,这很简单但是很无聊。既然我们可以创建存根而不会丢失存根以使编译器满意,那么为什么我们不能使工具自动完成呢?该工具不需要创建存根,而是读取java文件,收集信息,然后构建.class文件