重命名Java中的Zip文件中的文件/文件夹?

我有一个包含文件夹结构的zip文件,例如

  • 主文件夹/

    • subFolder1 /
    • subFolder2 /
    • subFolder3 /
    • 文件3.1
    • 文件3.2

我想使用Java 重命名文件夹main-folder,例如versionXY在该zip文件中。

有没有比提取整个zip文件并使用新的文件夹名称重新创建一个新的方法更简单的方法?

回答:

Zip是一种存档格式,因此变异通常涉及重写文件。

zip的某些特殊功能也会受阻(zip充满了“功能”)。除存档末尾的中央目录外,每个组件文件都在其文件名之后。Zip没有目录的概念-

文件名只是恰好包含"/"字符的字符串(以及诸如的子字符串)"../"

因此,您确实需要使用ZipInputStreamZipOutputStream重命名文件,同时进行重命名。如果确实需要,可以在适当的位置重写文件,以进行自己的缓冲。该过程的确会导致内容被重新压缩,因为标准API无法获取压缩形式的数据。

@Doval指出,@megasega的答案在NIO中使用Zip File

SystemProvider,在Java

SE 7中是新的(相对于此答案)。它的性能可能不会很好,就像RISC OS的GUI中的存档文件系统一样。三十年前。

这就是窍门。快速燃烧,因为它仅适用于中央目录而不适用于文件。

//  rezip( zipfile, "/main-folder", "/versionXY" );

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.nio.file.FileSystem;

import java.nio.file.FileSystems;

import java.nio.file.FileVisitResult;

import java.nio.file.Files;

import java.nio.file.LinkOption;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.nio.file.SimpleFileVisitor;

import java.nio.file.attribute.BasicFileAttributes;

protected void rezip( String zipfile, String olddir, String newdir ) {

Path zipFilePath = Paths.get( zipfile );

try (FileSystem fs = FileSystems.newFileSystem( zipFilePath, null )) {

Path oldpathInsideZipPath = fs.getPath( olddir );

if( ! Files.exists( Paths.get( newdir ) ) )

Files.createDirectory( Paths.get( newdir ) );

if ( Files.exists( oldpathInsideZipPath, LinkOption.NOFOLLOW_LINKS ) ) {

Files.walkFileTree(oldpathInsideZipPath, new SimpleFileVisitor<Path>() {

@Override

public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)

throws IOException

{

if( file.toString().indexOf( olddir ) > -1 ){

String a = file.toString().replaceAll( olddir, newdir );

Path b = fs.getPath( a );

if( ! Files.exists( b.getParent() ) ){

Files.createDirectories( b.getParent() );

}

Files.move( file, b, LinkOption.NOFOLLOW_LINKS );

}

return FileVisitResult.CONTINUE;

}

@Override

public FileVisitResult postVisitDirectory(Path dir, IOException e)

throws IOException

{

if (e == null) {

Files.delete(dir);

return FileVisitResult.CONTINUE;

} else {

// directory iteration failed

throw e;

}

}

});

}

fs.close();

} catch ( Exception e ) {

e.printStackTrace();

}

}

以上是 重命名Java中的Zip文件中的文件/文件夹? 的全部内容, 来源链接: utcz.com/qa/431635.html

回到顶部