最近项目中用到中文文件(名)的文件压缩功能,发现java的基本zip库是不支持中文文件名的。参考了网上的一些解决方法,但大多存在问题,后来发现Ant的apache tools下的zip库是支持中文的。下面就是采用该方式实现的在中文文件名下的文件压缩代码:
在给出实现代码之前,有一点需要指出,那就是必须要在工程中引入Ant.jar的包,否则会导致编译无法通过。
package test;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* 文件压缩(支持中文文件名)
* @author gaoyusi
*
*/
public class FileHelper {
/**
* 中文条件下文件(夹)压缩
* @throws IOException
*/
public static void zipCompress(String src,String des)
throws IOException{
ZipOutputStream out=null;
try {
CheckedOutputStream cusm=
new CheckedOutputStream(new FileOutputStream(des),new Adler32());
out=new ZipOutputStream(new BufferedOutputStream(cusm));
fileZip(new File(src),out,"");
}finally{
if(out!=null){
out.close();
}
}
}
private static void fileZip(File file, ZipOutputStream out,
String base) throws IOException{
if(file.isFile()){
if(base.length()>0){
out.putNextEntry(new ZipEntry(base));
}else{
out.putNextEntry(new ZipEntry(file.getName()));
}
BufferedReader in=new BufferedReader(
new InputStreamReader(new FileInputStream(file),"ISO8859_1"));
int c;
while((c=in.read())!=-1){
out.write(c);
}
in.close();
}else if(file.isDirectory()){
File[] subFiles=file.listFiles();
out.putNextEntry(new ZipEntry(base+File.separator));
base=base.length()!=0?base+File.separator:"";
for(File subFile:subFiles){
fileZip(subFile,out,base+subFile.getName());
}
}
}
}
测试代码如下:
package test;
import org.apache.log4j.Logger;
import org.junit.Test;
/**
* 中文文件压缩测试
* @author gaoyusi(http://blog.csdn.net/gaoyusi4964238)
*
*/
public class TestFileZip {
/*需要压缩的源文件夹路径*/
private String folderSrcPath="D://TEMP//";
/*压缩后的zip文件及其存放位置*/
private String forderDesPath="D://测试文件夹.zip";
/*需要压缩的源文件路径*/
private String fileStrPaht="D://TEMP//基05表.xls";
/*压缩后的zip文件及其存放位置*/
private String fileDesPath="D://测试文件.zip";
private Logger logger=Logger.getLogger(this.getClass().getName());
/**
* 测试文件夹中文环境下压缩
*
*/
@Test
public void testFileZip(){
try{
FileZipHelper.zipCompress(folderSrcPath,forderDesPath);
}catch(Exception e){
logger.error(e);
}
}
/**
* 测试文件中文环境下压缩
*
*/
@Test
public void testFolderZip(){
try{
FileZipHelper.zipCompress(fileStrPaht,fileDesPath);
}catch(Exception e){
logger.error(e);
}
}
}
测试结果如下图所示:
此外,还有一种实现中文文件名下的文件压缩的方式——那就是扩展java.util.zip下的