Java 重命名zip文件中的文件名

Java 重命名zip文件中的文件名,java,zip,rename,archive,Java,Zip,Rename,Archive,尝试重命名zip文件中的内部文件,而无需解压缩,然后通过编程重新压缩 例如。test.zip包含test.txt,我想更改它,使test.zip包含newtest.txt(test.txt重命名为newtest.txt,内容保持不变) 遇到了这个链接,但不幸的是,它希望test.txt存在于系统中。在本例中,src文件应该存在于服务器上 大宗报价 然后我在Linux上跨越zipnote,这就做到了,但不幸的是,我的版本不适用于大于4GB的文件 关于如何做到这一点有什么建议吗?最好使用java。这

尝试重命名zip文件中的内部文件,而无需解压缩,然后通过编程重新压缩

例如。test.zip包含test.txt,我想更改它,使test.zip包含newtest.txt(test.txt重命名为newtest.txt,内容保持不变)

遇到了这个链接,但不幸的是,它希望test.txt存在于系统中。在本例中,src文件应该存在于服务器上

大宗报价

然后我在Linux上跨越zipnote,这就做到了,但不幸的是,我的版本不适用于大于4GB的文件


关于如何做到这一点有什么建议吗?最好使用java。

这应该可以使用java 7 Zip文件系统提供程序,例如:

// syntax defined in java.net.JarURLConnection
URI uri = URI.create("jar:file:/directoryPath/file.zip");

try (FileSystem zipfs = FileSystems.newFileSystem(uri, Collections.<String, Object>emptyMap())) {
    Path sourceURI      = zipfs.getPath("/pathToDirectoryInsideZip/file.txt");
    Path destinationURI = zipfs.getPath("/pathToDirectoryInsideZip/renamed.txt");          

    Files.move(sourceURI, destinationURI); 
}
//在java.net.JarURLConnection中定义的语法
URI=URI.create(“jar:file:/directoryPath/file.zip”);

try(FileSystem zipfs=FileSystems.newFileSystem(uri,Collections.emptyMap()){ Path sourceURI=zipfs.getPath(“/pathToDirectoryInsideZip/file.txt”); Path destinationURI=zipfs.getPath(“/pathToDirectoryInsideZip/rename.txt”); move(sourceURI,destinationURI); }
我正在使用zip4j修改并重新写入中央目录部分中的文件头,以避免重写整个zip文件:

ArrayList<FileHeader> FHs = (ArrayList<FileHeader>) zipFile.getFileHeaders();
FHs.get(0).setFileName("namename.mp4");
FHs.get(0).setFileNameLength("namename.mp4".getBytes("UTF-8").length);
zipFile.updateHeaders ();

//where updateHeaders is :
    public void updateHeaders() throws ZipException, IOException {

        checkZipModel();

        if (this.zipModel == null) {
            throw new ZipException("internal error: zip model is null");
        }

        if (Zip4jUtil.checkFileExists(file)) {
            if (zipModel.isSplitArchive()) {
                throw new ZipException("Zip file already exists. Zip file format does not allow updating split/spanned files");
            }
        }

        long offset = zipModel.getEndCentralDirRecord().getOffsetOfStartOfCentralDir();
        HeaderWriter headerWriter = new HeaderWriter();

        SplitOutputStream splitOutputStream = new SplitOutputStream(new File(zipModel.getZipFile()), -1);
        splitOutputStream.seek(offset);
        headerWriter.finalizeZipFile(zipModel, splitOutputStream);
        splitOutputStream.close();
    }
ArrayList FHs=(ArrayList)zipFile.getFileHeaders();
FHs.get(0.setFileName)(“namename.mp4”);
FHs.get(0).setFileNameLength(“namename.mp4”.getBytes(“UTF-8”).length);
zipFile.updateHeaders();
//其中updateHeaders是:
public void updateHeaders()引发ZipException,IOException{
checkZipModel();
if(this.zipModel==null){
抛出新的ZipException(“内部错误:zip模型为空”);
}
if(Zip4jUtil.checkFileExists(文件)){
if(zipModel.isSplitArchive()){
抛出新ZipException(“Zip文件已存在。Zip文件格式不允许更新拆分/跨区文件”);
}
}
长偏移量=zipModel.GetEndCentralRecord().GetOffsetOffsetOffstartofCentralDir();
HeaderWriter HeaderWriter=新的HeaderWriter();
SplitOutputStream SplitOutputStream=新的SplitOutputStream(新文件(zipModel.getZipFile()),-1);
splitOutputStream.seek(偏移量);
finalizeZipFile(zipModel,splitOutputStream);
splitOutputStream.close();
}
“本地文件头”部分中的“名称”字段保持不变,因此此库中将出现不匹配异常。

这很棘手,但可能有问题,我不知道..

这是有效的,但只有在更改后,此语句才有效文件系统zipfs=FileSystems.newFileSystem(uri,Collections.emptyMap())--类型不匹配。我在java文档中为这个类映射env=newHashMap()使用了下面的代码;环境看跌期权(“容量”、“16G”);环境看跌期权(“区块大小”、“4k”);FileSystem zipfs=FileSystems.newFileSystem(uri,env)尽管此时我不知道容量和块大小代表什么。如果是,请共享。由于类型推断无法手动执行,因此发生了类型不匹配,我更新了示例。
capacity
blockSize
参数是为了内存文件系统而设置的。它们在Zip文件系统方面没有任何意义。