Zip4j⼯具类学习笔记(帮助⽂档翻译)
Zip4j⼯具类
特征:
创建,添加,提取,更新,从Zip⽂件中删除⽂件
⽀持流(ZipInputStream和ZipOutputStream)
读/写受密码保护的Zip⽂件和流
⽀持AES和Zip-Standard加密⽅法
⽀持Zip64格式
存储(⽆压缩)和放⽓压缩⽅法unicode在线工具
从拆分Zip⽂件创建或提取⽂件(例如:z01,z02,… zip)
⽀持zip 中的Unicode⽂件名和注释* Progress Monitor- 集成到应⽤程序和⾯向⽤户的应⽤程序
Maven
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.6.1</version>
</dependency>
⽤法
创建其中包含单个⽂件的zip⽂件/将单个⽂件添加到现有zip中
new ZipFile("filename.zip").addFile("");
Or
new ZipFile("filename.zip").addFile(new File(""));
创建包含多个⽂件的zip⽂件/将多个⽂件添加到现有zip中
new ZipFile("filename.zip").addFiles(Arrays.asList(new File("first_file"),new File("second_file")));
通过向其中添加⽂件夹来创建zip⽂件/将⽂件夹添加⾄现有zip中
new ZipFile("filename.zip").addFolder(new File("/users/some_user/folder_to_add"));
从v2.6开始,可以使⽤ExcludeFileFilter在将⽂件夹添加到zip时排除某些⽂件
ExcludeFileFilter excludeFileFilter = filesToExclude::contains;
ZipParameters zipParameters =new ZipParameters();
zipParameters.setExcludeFileFilter(excludeFileFilter);
new ZipFile("filename.zip").addFolder(new File("/users/some_user/folder_to_add"), zipParameters);
从流创建zip⽂件/将流添加到现有zip
new ZipFile("filename.zip").addStream(inputStream,new ZipParameters());
传递new ZipParameters(),如上⾯的例⼦中,将Zip4j使⽤默认参数拉链。请查看 ZipParameters以查看默认配置。
创建压缩⽅法库的zip⽂件/向压缩⽅法库的zip⽂件添加条⽬
默认情况下,Zip4j使⽤Deflate压缩算法来压缩⽂件。但是,如果您不想使⽤任何压缩(称为存储压缩),可以按照以下⽰例所⽰进⾏操作:
ZipParameters zipParameters =new ZipParameters();
zipParameters.setCompressionMethod(CompressionMethod.STORE);
new ZipFile("filename.zip").addFile("fileToAdd", zipParameters);
您可以类似地将zip参数传递给所有其他⽰例,以创建⼀个STORE压缩的zip⽂件。
创建受密码保护的zip⽂件/使⽤密码保护将⽂件添加到现有zip中
AES加密
ZipParameters zipParameters =new ZipParameters();
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
//下⾯的⾏是可选的。默认情况下使⽤AES 256。您可以覆盖它以使⽤AES128。AES192仅⽀持提取。
zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256);
List<File> filesToAdd = Arrays.asList(
new File("somefile"),
new File("someotherfile")
);
ZipFile zipFile =new ZipFile("filename.zip","password".toCharArray());
zipFile.addFiles(filesToAdd, zipParameters);
邮编标准加密:
代替AES,替换zipParameters.setEncryptionMethod(EncryptionMethod.AES);为
zipParameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);。您可以省略该⾏以设置Aes Key强度。顾名思义,这仅适⽤于AES加密。
在以上所有⽰例中,您可以类似地传⼊具有适当密码配置的zip参数以创建受密码保护的zip⽂件
创建⼀个拆分的zip⽂件
如果要在⼤⼩超过特定限制时将zip⽂件拆分为多个⽂件,可以这样进⾏:
List<File> filesToAdd = Arrays.asList(
new File("somefile"),
new File("someotherfile")
);
ZipFile zipFile =new ZipFile("filename.zip");
传递new ZipParameters(),如上⾯的例⼦中,将Zip4j使⽤默认参数拉链。请查看 ZipParameters以查看默认配置。
压缩⽂件格式指定最⼩65536字节(64kb)作为拆分⽂件的最⼩长度。如果指定的值⼩于此值,Zip4j将引发异常。
要创建具有密码保护的拆分zip,请传递适当的ZipParameters,如下例所⽰:
ZipParameters zipParameters =new ZipParameters();
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
List<File> filesToAdd = Arrays.asList(
new File("somefile"),
new File("someotherfile")
);
ZipFile zipFile =new ZipFile("filename.zip","password".toCharArray());
Zip64格式
Zip64是⼀种zip功能,当zip⽂件的⼤⼩超过可以存储在4个字节中的最⼤值(即⼤于4,294,967,295字节)时,便⽀持zip⽂件。传统上,zip标头提供4个字节来存储⽂件⼤⼩。但是与⼏⼗年前相⽐,随着⽂件⼤⼩的增长,zip⽂件格式扩展了对⽂件⼤⼩的⽀持,通过添加额外的标头扩展了4个字节,这些标头使⽤8个字节作为⽂件⼤⼩(压缩和未压缩的⽂件⼤⼩)。此功能称为Zip64。
当Zip4j检测到zip⽂件超出此⽂件⼤⼩限制时,它将⾃动将其压缩为Zip64格式并添加适当的标头。您⽆需为Zip4j明确指定任何标志即可使⽤此功能
提取zip中的所有⽂件
new ZipFile("filename.zip").extractAll("/destination_directory");
提取受密码保护的zip中的所有⽂件
new ZipFile("filename.zip","password".toCharArray()).extractAll("/destination_directory");
从zip提取单个⽂件
new ZipFile("filename.zip").extractFile("","/destination_directory");
从zip提取⽂件夹(⾃v2.6.0起)
new ZipFile("filename.zip").extractFile("folderNameInZip/","/destination_directory");
从受密码保护的zip提取单个⽂件
new ZipFile("filename.zip","password".toCharArray()).extractFile("","/destination_directory");
从v2.6.0开始:如果⽂件名表⽰⽬录,则zip4j将提取zip中属于该⽬录的所有⽂件。
从zip提取单个⽂件并为其赋予新⽂件名
下⾯的⽰例将从ip⽂件中提取⽂件到输出⽬录/destination_directory,并为⽂件命名。如果没有新⽂件名的第三个参数,将使⽤与zip中的⽂件相同的名称,本例中为。如果要提取的⽂件是⽬录,newFileName则将参数⽤作⽬录名。
new ZipFile("filename.zip","password".toCharArray()).extractFile("","/destination_directory","");
获取zip⽂件中条⽬的输⼊流
ZipFile zipFile =new ZipFile("filename.zip");
FileHeader fileHeader = FileHeader("entry_name_");
InputStream inputStream = InputStream(fileHeader);
现在,您可以使⽤此输⼊流从其中读取内容/将内容写⼊输出流。请注意,条⽬/⽂件名是相对于其所在⽬录的。如果entry_name_位于zip的
“root_folder ”⽂件夹中,则可以使⽤FileHeader("root_folder/entry_name_");
从zip⽂件中删除⽂件/条⽬
new ZipFile("filename.zip").removeFile("fileNameInZipToRemove");
如果fileNameInZipToRemove代表⼀个⽂件夹。该⽂件夹下的所有⽂件和⽂件夹也将被删除(⾃zip4j
v2.5.0起有效。所有先前版本仅删除单个条⽬,即使它是⽂件夹)。
请注意,⽂件名是zip中根⽬录的相对名称。也就是说,如果要删除的⽂件存在于名为“ folder1”的⽂件夹中,⽽该⽂件夹⼜存在于名
为“ root-folder”的⽂件夹中,则可以按以下步骤从zip中删除该⽂件:
new ZipFile("filename.zip").removeFile("root-folder/folder1/fileNameInZipToRemove");
如果要确定要删除的⽂件存在于zip⽂件中,或者如果不想在处理removeFileapi 时将⽂件名作为字符串处理,则可以使⽤其他重载⽅法,该⽅法采⽤FileHeader:
ZipFile zipFile =new ZipFile("someZip.zip");
FileHeader fileHeader = FileHeader("fileNameInZipToRemove");
if(fileHeader == null){
// file does not exist
}
从zip4j v2.5.0开始,可以从zip⽂件中删除多个⽂件和⽂件夹。现在,您可以传递⼀个列表,如下⾯的代码所⽰:
ZipFile zipFile =new ZipFile("someZip.zip");
List<String> filesToRemove = Arrays.asList("","","some-folder/","some-new-folder-1/somefile.pdf");
上⾯的代码将删除,下的所有⽂件和⽂件夹some-folder(包括some-folder)和刚进⼊somefile.pdf的⽂件夹中some-new-folder-1。所有其他⽂件和⽂件夹在zip⽂件中均保持不变。
重命名zip⽂件中的条⽬
有三种⽅法可以使⽤zip4j重命名zip⽂件中的条⽬。⼀种⽅法是传递⽂件头和新⽂件名:
ZipFile zipFile =new ZipFile("sample.zip");
FileHeader fileHeader = FileHeader("entry-to-be-changed.pdf");
第⼆种⽅法是只传⼊要更改的⽂件名(⽽不是⽂件头)和新⽂件名。
new ZipFile("filename.zip").renameFile("entry-to-be-changed.pdf","new-file-name.pdf");
也可以⼀次更改多个⽂件名。在这种情况下,您必须使⽤⼀个映射,该映射中条⽬的键是要更改的条⽬,⽽映射的值是新⽂件名:
Map<String, String> fileNamesMap =new HashMap<>();
fileNamesMap.put("","");
fileNamesMap.put("secondFile.pdf","newSecondFile.pdf");
fileNamesMap.put("some-folder/thirdFile.bin","some-folder/newThirdFile.bin");
new ZipFile("filename.zip").renameFile("entry-to-be-changed.pdf","new-file-name.pdf");
要修改⽂件夹内的条⽬名称,新⽂件名也应包含完整的⽗路径。例如,如果some-entry.pdf⽂件夹中包含按名称命名的条⽬,则some-folder/some-sub-folder/将该条⽬名称修改为some-new-entry.pdf:
new ZipFile("filename.zip").renameFile("some-folder/some-sub-folder/some-entry.pdf","some-folder/some-sub-folder/new-entry.pdf");
如果缺少⽗路径路径,则该⽂件将放在zip⽂件的根⽬录中。在下⾯的⽰例中,⽂件重命名后,some-new-entry.pdf将存在于zip⽂件的根⽬录中,⽽不是位于some-folder/some-sub-folder/:
new ZipFile("filename.zip").renameFile("some-folder/some-sub-folder/some-entry.pdf","some-new-entry.pdf");
这也提供了将条⽬“移动”到另⼀个⽂件夹的灵活性。下⾯的例⼦将移动 some-entry.pdf从some-folder/some-sub-folder/到folder-to-be-moved-to/sub-folder/该⽂件也将被重新命名为new-entry.pdf。要仅移动⽂件,请使⽤相同的⽂件名⽽不是新⽂件名。
new ZipFile("filename.zip").renameFile("some-folder/some-sub-folder/some-entry.pdf","folder-to-be-moved-to/sub-folder/new-entry.pdf");
如果要修改的条⽬是⽬录,则该⽬录中的所有条⽬都将被重命名,以便所有这些条⽬都具有新的⽂件
夹名称作为⽗⽂件夹。以zip格式,⽬录下的所有条⽬名称都将包含全名作为其⽂件名。例如,如果有⼀个由名称的条⽬的⽬录⾥⾯directoryName,条⽬的⽂件名会。并且,如果⽬录名现在已更改为newDirectoryName,则其下的条⽬也将更改为
,因此提取zip⽂件时,该⽬录 将位于下newDirectoryName。
压缩⽂件格式不允许修改拆分的zip⽂件,如果尝试重命名拆分的zip⽂件中的⽂件,zip4j将引发异常。
将拆分的zip⽂件合并为⼀个zip
这与创建拆分的zip⽂件相反,也就是说,此功能会将合并的zip⽂件(将多个⽂件拆分成⼀个zip⽂件)合并
new ZipFile("split_zip_file.zip").mergeSplitFiles(new File("merged_zip_file.zip"));
如果拆分的zip⽂件(在本例中split_zip_file.zip)不是拆分的zip⽂件,则此⽅法将引发异常
列出所有zip⽂件
List<FileHeader> fileHeaders =new ZipFile("zipfile.zip").getFileHeaders();
fileHeaders.stream().forEach(fileHeader -> System.out.FileName()));
您可以从FileHeader与zip中每个⽂件/条⽬相对应的对象中获取所有其他信息。
检查zip⽂件是否受密码保护
new ZipFile("encrypted_zip_file.zip").isEncrypted();
检查zip⽂件是否为拆分的zip⽂件
new ZipFile("split_zip_file.zip").isSplitArchive();
设置zip⽂件的注释
new ZipFile("some_zip_file.zip").setComment("Some comment");
删除压缩⽂件的注释
new ZipFile("some_zip_file.zip").setComment("");
获取zip⽂件的评论
new ZipFile("some_zip_file.zip").getComment();
检查压缩⽂件是否有效
Note: This will only check for the validity of the headers and not the validity of each entry in the zip file. new ZipFile("valid_zip_file.zip").isValidZipFile();
使⽤流
使⽤ZipOutputStream添加条⽬
import net.lingala.zip4j.io.outputstream.ZipOutputStream;
import net.del.ZipParameters;
import net.ums.AesKeyStrength;
import net.ums.CompressionMethod;
import net.ums.EncryptionMethod;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class ZipOutputStreamExample {
public void zipOutputStreamExample(File outputZipFile, List<File> filesToAdd,char[] password,
CompressionMethod compressionMethod,boolean encrypt,
EncryptionMethod encryptionMethod, AesKeyStrength aesKeyStrength)
throws IOException {
ZipParameters zipParameters =buildZipParameters(compressionMethod, encrypt, encryptionMethod, aesKeyStrength); byte[] buff =new byte[4096];
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论