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