[转:http://blog.csdn.net/lian_zhihui1984/article/details/6893119]
由于工作需要,导出CSV功能,太大的话要分成多个,并且导出文件要压缩成带密码的zip。
JAVA本身的ZIP输入输出流是支持多个文件的,但是没有设置密码功能。
网上搜索了很久,最后选择使用开源的winzipaes。
地址 http://code.google.com/p/winzipaes/
下载它的source,自己编译生成jar。在编译时,要用到bcprov-jdk jar包,到下面的网页里下载。
目前的winzipaes_src_20110911.zip,官网推荐使用bcprov-jdk15-146.jar
http://www.bouncycastle.org/latest_releases.html
1. 使用示例(源码里的例子,没测试过)
压缩
- File inFile;
- File outFile;
- ...
- AESEncrypter encrypter = new AESEncrypterBC();
- AesZipFileEncrypter enc = new AesZipFileEncrypter(outFile,encrypter);
- try {
- enc.add(inFile, password);
- } finally {
- enc.close();
- }
解压
- AesZipFileDecrypter zipFile = new AesZipFileDecrypter( new File("doc/zipSpecificationAes.zip"), new AESDecrypterBC() );
- ExtZipEntry entry = zipFile.getEntry( "zipSpecification.txt" );
- zipFile.extractEntryWithTmpFile( entry, new File("doc/zipSpecification.txt"), "foo" );
2. 压缩多个文件时,有两个方法
(1) 预先把多个文件压缩成zip,使用enc.addAll(inZipFile, password);方法。
(2)循环调用enc.add(inFile, password);,每次用相同的密码
3. 压缩包里的path
使用add(File file, String password)方法,会把file的路径(绝对路径或相对路径,有创建file时决定)自动作为zip里的path。
不想要路径或者想自己指定的话,使用add(File file, String password)方法。
4. 不用inFile,通过流创建(省却创建临时文件,我就是用这个)
使用add(String name, InputStream is, String password)方法。
5. 我的导出CSV并带密码压缩代码(大体样子,不完全)
- List<DTO> dtoList = getData();
- OutputStream out = null;
- AesZipFileEncrypter enc = null;
- byte[] bom ={(byte) 0xEF,(byte) 0xBB,(byte) 0xBF};
- try {
- out = response.getOutputStream();
- enc = new AesZipFileEncrypter(out, new AESEncrypterBC());
- int totalRowNum = dtoList.size();
- int rowNum = 0;
- final int MAX_ROW_NUM = 1000;
- int fileNum = 0;
- String csvData = "";
- for (DTO dto : dtoList) {
- rowNum++;
- // edit csv data
- ...
- if (rowNum % MAX_ROW_NUM == 0 ||
- rowNum == totalRowNum) {
- // excel打开UTF乱码的对应
- byte[] csvDataBytes = csvData.getBytes();
- byte[] outputDataBytes = new byte[csvDataBytes.length + bom.length];
- System.arraycopy(bom, 0, outputDataBytes , 0, bom.length);
- System.arraycopy(csvDataBytes , 0, outputDataBytes , bom.length, csvDataBytes .length);
- DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(outputDataBytes ));
- // 添加到zip
- enc.add((++fileNum) + ".csv", dataInputStream, “123456”);
- if (rowNum < totalRowNum) {
- csvData = "";
- }
- }
- }
- out.flush();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (enc != null) {enc.close();}
- if (out != null) {out.close();}
- }
遗留问题(有时间研究一下代码看看有什么原因和解决方法):
1. 好像没有不设密码的方法
2. 压缩包里的文件名会出现乱码
相关推荐
Java解压和压缩带密码...本文详细介绍了Java解压和压缩带密码的zip文件的过程,通过winzipaes开源项目和工具类,可以解决ZIP压缩文件的密码问题,并支持中文文件名。该文对大家的学习或者工作具有一定的参考学习价值。
winzipaes是Java操作ZIP文件的开源项目,支持密码,但不支持中文文件名。此文件中包含修改后的源码、文档、jar包、依赖包及示例程序等文件。可以压缩文件名含有中文的文件,修改之处可以参看博客...
在Java中,可以使用`java.util.zip`包下的类,如`ZipOutputStream`和`ZipEntry`来创建和管理ZIP文件。 2. **WinZipAES库**:为了在Java程序中实现WinZipAES加密,你需要引入`winzipaes.jar`这个第三方库。这个库为...
Java 个人练习Demo ,由于JDK自带的ZIP操作接口并不支持密码、中文文件名,这里使用了winzipaes开源项目作为解压,其支持带密码压缩和解压。源码、文档、jar包、依赖包及示例程序等文件。可以压缩文件名含有中文的...
winzipaes是Java操作ZIP文件的开源项目,支持密码,但不支持中文文件名,此文件中是修改后的源码,可以压缩文件名含有中文的文件,修改之处可以参看博客http://xjlsgcjdtc.iteye.com/blog/1439514或者...
本文将聚焦于名为"winziaes.jar"的文件,该文件来源于"winzipaes_src_20110222.zip"压缩包,这是一款与WinZip AES加密技术相关的源代码库。我们将深入探讨WinZip AES加密技术的原理、应用以及其在源代码中的实现。 ...
首先,ZIP是一种广泛使用的文件压缩格式,它允许用户将多个文件打包成一个单一的档案,以便于存储、传输或分发。然而,原始的ZIP格式并不支持高级加密,这可能成为数据保护的一个弱点。为了解决这个问题,WinZip AES...
1. **创建ZIP文件**:在创建ZIP文件时,程序会遍历所有要压缩的文件,对每个文件应用DEFLATE或其他支持的压缩算法,然后将压缩后的数据和元数据写入ZIP存档。 2. **解压ZIP文件**:解压ZIP文件时,读取存档中的每个...
《深入理解WinZip AES文件加密与解压:Java实现与应用》 WinZip AES(Advanced Encryption Standard)是一种广泛应用于文件加密的标准,它以其强大的安全性在众多加密算法中脱颖而出。AES的采用使得用户能够对文件...
winzipaes支持的java springboot的文件加密和解密的方法以及对中文文件名文件的上传的utf-8编码支持,已全部代码做了二次代码优化,需要自己手动导入包。以及pom的支持,有需要的可以看下源码,或者联系我本人,博客...
winzipaes20120809.jar
Java中可以使用第三方库如Apache Commons Compress或unrar4java来处理RAR文件的解压缩和解密。 另一方面,`winzipaes_zh_CN_supported.zip`可能包含了关于WinZip AES加密的中文文档或示例。WinZip是Windows平台上的...
4. **加密和设置属性**:可以使用`SetEncryption()`方法为ZIP文件设置密码,`SetComment()`方法添加注释,或者`SetCompressionLevel()`方法调整压缩级别。例如: ```csharp using (var zip = new ZipFile()) { ...