zip压缩中文文件名(支持压缩文件或者文件夹)

项目中需要提供下载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();
        }
    }
}

 

你可能感兴趣的:(java,apache,ant,F#)