[转: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. 压缩包里的文件名会出现乱码
相关推荐
winzipaes是Java操作ZIP文件的开源项目,支持密码,但不支持中文文件名。此文件中包含修改后的源码、文档、jar包、依赖包及示例程序等文件。可以压缩文件名含有中文的文件,修改之处可以参看博客...
Java 个人练习Demo ,由于JDK自带的ZIP操作接口并不支持密码、中文文件名,这里使用了winzipaes开源项目作为解压,其支持带密码压缩和解压。源码、文档、jar包、依赖包及示例程序等文件。可以压缩文件名含有中文的...
winzipaes是Java操作ZIP文件的开源项目,支持密码,但不支持中文文件名,此文件中是修改后的源码,可以压缩文件名含有中文的文件,修改之处可以参看博客http://xjlsgcjdtc.iteye.com/blog/1439514或者...
java使用winzipaes打包必须包
winziaes.jar(winzipaes_src_20110222.zip)
winzipaes支持的java springboot的文件加密和解密的方法以及对中文文件名文件的上传的utf-8编码支持,已全部代码做了二次代码优化,需要自己手动导入包。以及pom的支持,有需要的可以看下源码,或者联系我本人,博客...
winzipaes文件加密和解压的工具包,代码工具已上传,此处为需要的jar的整合的资源包,包含了java支持的密码解密和加密,需要的不要错过,有任何疑问可以博客找到我
winzipaes20120809.jar
与其它jar文件配合使用,解决java ZIP加解密问题