项目中需要提供下载zip包的功能,zip对中文文件名的文件进行打包的时候,会出现文件名乱码问题,从网上找到了解决办法,使用ant.jar进行压缩,修改网上的代码,支持可以对单个文件或者一个文件夹进行压缩的功能,附件为使用的ant.jar
/**
*
*/
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.CRC32;
import java.util.zip.CheckedOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* @author XL
*
*/
public class ZipUtil
{
/**
* @param args
*/
public static void main(String[] args)
{
zip("D:\\下载小说\\ttt.zip","D:\\下载小说\\0628");
}
/**
* 由于java.util.zip.ZipOutputStream有中文乱码问题,
* 所以采用org.apache.tools.zip.ZipOutputStream。
*/
public static void zip(String zipFileName,String srcFileName)
{
try
{
// 创建文件输出流对象
FileOutputStream f = new FileOutputStream(new File(zipFileName));
CheckedOutputStream ch = new CheckedOutputStream(f, new CRC32());
// 创建ZIP数据输出流对象
ZipOutputStream zipOut = new ZipOutputStream(
new BufferedOutputStream(ch));
// 调用打包的方法
zip(zipOut,srcFileName);
// 关闭创建的流对象
zipOut.close();
}
catch (Exception e)
{
System.out.println(e);
}
}
/**
* 递归zip
* @param zipOut
* @param fileName
* @throws IOException 2009-9-24
*/
public static void zip(ZipOutputStream zipOut, String fileName) throws IOException
{
File srcFileName = new File(fileName);
if (srcFileName.isDirectory())
{
// 如果是文件夹,遍历下面的文件
File[] files = srcFileName.listFiles();
for (File file : files)
{
zip(zipOut,file.getAbsolutePath());
}
}
else
{
// 创建文件输入流对象
String encode = "ISO8859_1";
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(srcFileName), encode));
// 创建指向压缩原始文件的入口
ZipEntry entry = new ZipEntry(srcFileName.getName());
zipOut.putNextEntry(entry);
// 向压缩文件中输出数据
int nNumber;
while ((nNumber = in.read()) != -1)
{
zipOut.write(nNumber);
}
in.close();
}
}
}