zip压缩解决文件名中文乱码问题
使用jdk自带的zip工具类java.util.zip.ZipEntry,java.util.zip.ZipFile,java.util.zip.ZipInputStream,java.util.zip.ZipOutputStream 进行zip压缩时,没法解决文件名中文乱码问题
这里使用apache 旗下的commons-compress 库,官网是:http://commons.apache.org/proper/commons-compress/download_compress.cgi
?
我使用maven 进行构建,pom配置如下:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.5</version></dependency>
?commons-compress 解决了文件名中文乱码问题,参考:http://www.cnblogs.com/un4sure/archive/2011/09/27/2193298.html
范例:
(1)压缩单个文件:
压缩D:\\Temp\\a\\password_密码.xls,压缩后的zip文件是d:\\Temp\\a\\a\\b\\c.zip
package com.jn.test;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.apache.commons.compress.archivers.ArchiveException;import org.apache.commons.compress.archivers.ArchiveOutputStream;import org.apache.commons.compress.archivers.ArchiveStreamFactory;import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;import org.junit.Test;import com.common.util.SystemUtil;import com.io.hw.file.util.FileUtils;public class ZIPTest {@Testpublic void test_01() {try {FileOutputStream fou = new FileOutputStream("d:\\Temp\\a\\a\\b\\c.zip");ArchiveOutputStream archOuts = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);if(archOuts instanceof ZipArchiveOutputStream){ZipArchiveOutputStream zipOut=(ZipArchiveOutputStream)archOuts;String file="D:\\Temp\\a\\password_密码.xls";ZipArchiveEntry zipEntry=new ZipArchiveEntry(new File(file),SystemUtil.getFileSimpleName(file));zipOut.putArchiveEntry(zipEntry);zipOut.write(FileUtils.readBytes4file(file));zipOut.closeArchiveEntry();zipOut.flush();zipOut.finish();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (ArchiveException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
?运行之后会生成文件d:\\Temp\\a\\a\\b\\c.zip:
?
(1)压缩多个文件:
@Testpublic void test_02() {try {FileOutputStream fou = new FileOutputStream("d:\\Temp\\a\\a\\b\\c.zip");ArchiveOutputStream archOuts = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);if (archOuts instanceof ZipArchiveOutputStream) {ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream) archOuts;String file01 = "D:\\Temp\\a\\password_密码.xls";ZipArchiveEntry zipEntry = new ZipArchiveEntry(new File(file01), SystemUtil.getFileSimpleName(file01));zipOut.putArchiveEntry(zipEntry);zipOut.write(FileUtils.readBytes4file(file01));String file02 = "D:\\Temp\\a\\ccc.jar";ZipArchiveEntry zipEntry2 = new ZipArchiveEntry(new File(file01), SystemUtil.getFileSimpleName(file02));zipOut.putArchiveEntry(zipEntry2);zipOut.write(FileUtils.readBytes4file(file02));zipOut.closeArchiveEntry();zipOut.flush();zipOut.finish();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (ArchiveException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
?压缩后的zip文件:
?
?