您的位置:首页 > 编程语言 > Java开发

java生成压缩文件

2015-04-20 16:21 274 查看
在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载。所以自己写了一个压缩文件的工具类。该工具类支持单个文件和文件夹压缩。放代码:

[java] view plaincopyprint?import java.io.BufferedOutputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
  
import org.apache.tools.zip.ZipEntry;  
import org.apache.tools.zip.ZipOutputStream;  
  
/**  
 * @project: Test  
 * @author chenssy 
 * @date 2013-7-28  
 * @Description: 文件压缩工具类 
 *                将指定文件/文件夹压缩成zip、rar压缩文件 
 */  
public class CompressedFileUtil {  
    /** 
     * 默认构造函数 
     */  
    public CompressedFileUtil(){  
          
    }  
  
    /** 
     * @desc 将源文件/文件夹生成指定格式的压缩文件,格式zip 
     * @param resourePath 源文件/文件夹 
     * @param targetPath  目的压缩文件保存路径 
     * @return void 
     * @throws Exception  
     */  
    public void compressedFile(String resourcesPath,String targetPath) throws Exception{  
        File resourcesFile = new File(resourcesPath);     //源文件  
        File targetFile = new File(targetPath);           //目的  
        //如果目的路径不存在,则新建  
        if(!targetFile.exists()){       
            targetFile.mkdirs();    
        }  
          
        String targetName = resourcesFile.getName()+".zip";   //目的压缩文件名  
        FileOutputStream outputStream = new FileOutputStream(targetPath+"\\"+targetName);  
        ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(outputStream));  
          
        createCompressedFile(out, resourcesFile, "");  
          
        out.close();    
    }  
      
    /** 
     * @desc 生成压缩文件。 
     *               如果是文件夹,则使用递归,进行文件遍历、压缩 
     *       如果是文件,直接压缩 
     * @param out  输出流 
     * @param file  目标文件 
     * @return void 
     * @throws Exception  
     */  
    public void createCompressedFile(ZipOutputStream out,File file,String dir) throws Exception{  
        //如果当前的是文件夹,则进行进一步处理  
        if(file.isDirectory()){  
            //得到文件列表信息  
            File[] files = file.listFiles();  
            //将文件夹添加到下一级打包目录  
            out.putNextEntry(new ZipEntry(dir+"/"));  
              
            dir = dir.length() == 0 ? "" : dir +"/";  
              
            //循环将文件夹中的文件打包  
            for(int i = 0 ; i < files.length ; i++){  
                createCompressedFile(out, files[i], dir + files[i].getName());         //递归处理  
            }  
        }  
        else{   //当前的是文件,打包处理  
            //文件输入流  
            FileInputStream fis = new FileInputStream(file);  
              
            out.putNextEntry(new ZipEntry(dir));  
            //进行写操作  
            int j =  0;  
            byte[] buffer = new byte[1024];  
            while((j = fis.read(buffer)) > 0){  
                out.write(buffer,0,j);  
            }  
            //关闭输入流  
            fis.close();  
        }  
    }  
      
    public static void main(String[] args){  
        CompressedFileUtil compressedFileUtil = new CompressedFileUtil();  
          
        try {  
            compressedFileUtil.compressedFile("G:\\zip", "F:\\zip");  
            System.out.println("压缩文件已经生成...");  
        } catch (Exception e) {  
            System.out.println("压缩文件生成失败...");  
            e.printStackTrace();  
        }  
    }  
}  

  

  运行程序结果如下:

  压缩之前的文件目录结构:

 




 提示:如果是使用java.util下的java.util.zip进行打包处理,可能会出现中文乱码问题,这是因为java的zip方法不支持编码格式的更改,我们可以使用ant.java下的zip工具类来进行打包处理。所以需要将ant.jar导入项目的lib目录下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: