java中压缩文件并下载的实例详解

 更新时间:2021年02月17日 09:31:50   作者:小妮浅浅  
在本篇内容里小编给大家整理的是一篇关于java中压缩文件并下载的实例详解内容,有兴趣的朋友们可以学习下。

当我们对一些需要用到的资料进行整理时,会发现文件的内存占用很大,不过是下载或者存储,都不是很方便,这时候我们会想到把文件变成zip格式,即进行压缩。在正式开始压缩和下载文件之前,我们可以先对zip的格式进行一个了解,然后再就具体的方法给大家带来分享。

1、ZIP文件格式

[local file header + file data + data descriptor]{1,n} + central directory + end of central directory record

[文件头+文件数据+数据描述符]{此处可重复n次}+核心目录+目录结束标识当压缩包中有多个文件时,就会有多个[文件头+文件数据+数据描述符]

2、压缩和下载步骤

(1)创建压缩包前准备

//定义压缩包存在服务器的路径
String path = request.getSession().getServletContext().getRealPath("/WEB-INF/fileTemp");
//创建路径
File FilePath = new File(path + "/file");
if (!FilePath.exists()) {
FilePath.mkdir();
}
String path = FilePath.getPath() + "/";
//定义导出压缩包的名称
String title ="问价压缩包";
//压缩包格式
String fileNamezip = title + ".zip";
String zipPath = path + fileNamezip;
//创建一个ZIP输出流并实例化缓冲区域
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipPath)));
//设置编码格式(解决linux出现乱码)
out.setEncoding("gbk");
//定义字节数组
byte data[] = new byte[2048];
//获取文件记录(获取文件记录代码省略)
List FileList =。。。;
if (!FileList.isEmpty()) {
ExportUtil util = new ExportUtil(title,title,
request, response, FilePath.getPath());
}

(2)删除压缩包之前的数据,创建压缩包

util.startZip(FilePath.getPath());

(3)循环将需要压缩的文件放到压缩包中

for (int i = 0; i < FileList.size(); i++) {
fileVo fileVo=FileList.get(i);
export(fileVo,request,response,title,FilePath.getPath(),fileName);
}
------
public void export(fileVo fileVo, HttpServletRequest request,
HttpServletResponse response, String title,String path, String fileName) {
FileOutputStream fileOutputStream = null;
try {
File dirFile = null; 
int i = fileVo.getName().lastIndexOf(".");
    if(i!=-1){//存在文件类型
     fileName1 = fileName1 + "." + (fileVo.getName()).substring(i+1);
    }
boolean bFile = false;
String mkdirName = path + File.separatorChar + title;
dirFile = new File(mkdirName);
if(!dirFile.exists()) {
dirFile.getParentFile().mkdirs();
}
if (dirFile.isDirectory()) {
path = mkdirName + File.separatorChar + fileName1;
} else {
bFile = dirFile.mkdirs();
}
if (bFile) {
path = mkdirName + File.separatorChar + fileName1;
} 
fileOutputStream = new FileOutputStream(path.replace("*", "")); 
String fileName = URLEncoder.encode(fileName1, "UTF-8");
if (fileName.length() > 110) {
fileName = new String(fileName1.getBytes("gb2312"), "ISO8859-1");
}
response.setHeader("Connection", "close");
response.setHeader("Content-Type", "application/octet-stream");
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ Utf8Util.toUtf8String(fileName) + "\"");
//读取文件流输出到到另一个位置
fileVo.getFileIo(fileOutputStream);
fileOutputStream.close(); 
} catch (Exception e) {
logger.error("异常:原因如下"+e.getMessage(), e);
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
logger.error("异常:原因如下"+e1.getMessage(), e1);
}
}
}

(4)压缩完成,关闭输出流。

util.entdZip(FilePath.getPath());

java生成压缩文件示例代码扩展

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中压缩文件并下载的实例详解的文章就介绍到这了,更多相关如何在java中压缩文件并下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8新特性之StampedLock_动力节点Java学院整理

    Java8新特性之StampedLock_动力节点Java学院整理

    本文从synchronized、Lock到Java8新增的StampedLock进行对比分析,对Java8新特性之StampedLock相关知识感兴趣的朋友一起看看吧
    2017-06-06
  • 每日六道java新手入门面试题,通往自由的道路--线程池

    每日六道java新手入门面试题,通往自由的道路--线程池

    这篇文章主要为大家分享了最有价值的6道线程池面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • IDEA2020.1同步系统设置到GitHub的方法

    IDEA2020.1同步系统设置到GitHub的方法

    这篇文章主要介绍了IDEA2020.1同步系统设置到GitHub的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Java中字符串与日期转换常见方法总结

    Java中字符串与日期转换常见方法总结

    这篇文章主要给大家介绍了关于Java中字符串与日期转换常见方法的相关资料,在Java编程中经常需要将字符串表示的日期转换为日期对象进行处理,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Springboot应用gradle Plugin示例详解

    Springboot应用gradle Plugin示例详解

    这篇文章主要介绍了Springboot应用gradle Plugin详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Intellij IDEA配置Jetty的方法示例

    Intellij IDEA配置Jetty的方法示例

    这篇文章主要介绍了Intellij IDEA配置Jetty的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Java的Cglib动态代理实现方式详解

    Java的Cglib动态代理实现方式详解

    这篇文章主要介绍了Java的Cglib动态代理实现方式详解,CGLIB是强大的、高性能的代码生成库,被广泛应用于AOP框架,它底层使用ASM来操作字节码生成新的类,为对象引入间接级别,以控制对象的访问,需要的朋友可以参考下
    2023-11-11
  • 如何用Java实现啥夫曼编码

    如何用Java实现啥夫曼编码

    在开发手机程序时,总是希望压缩网络传输的信息,以减少流量。本文仅以哈夫曼编码为引导,抛砖引玉,实现压缩功能
    2013-08-08
  • java SpringMVC学习使用详解

    java SpringMVC学习使用详解

    本篇文章主要介绍了java SpringMVC——如何获取请求参数详解,详细的介绍了每种参数注解的用法及其实例。感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 如何通过Java添加水印到Word文档

    如何通过Java添加水印到Word文档

    这篇文章主要介绍了如何通过Java添加水印到Word文档,水印是一种常用于各种文档的声明、防伪手段,一般可设置文字水印或者加载图片作为水印。以下内容将分享通过Java编程给Word文档添加水印效果的方法,需要的朋友可以参考下
    2019-07-07

最新评论