java原生文件打包
一、背景
前端时间,自己做的项目需要打包功能,不想再引外部的jar包
便用java.util.zip做了下该功能
二、适用场景
生成多个word、excel、xml等文件,并要求打包下载的情形
例:项目信息的多选导出word
三、实现
实现分为三个部分,分别是
1、将字符串保存为文件,都是最基本的IO操作
/**
* @Description 将字符串保存为文件
* @author liuy-8
* @date 2015年5月20日 下午1:48:18
* @param filePath
* @param content
*/
public static void saveFile(String filePath, String content){
File file = new File(filePath);
FileWriter fw = null;
//这里没有使用BufferWrite,是因为数据是一次性写入
//BufferWrite的优势在于调用write方法时,使用缓冲区
//而FileWriter每次调用write方法,都调用StreamEncoder的write方法
try {
fw = new FileWriter(file);//缓冲区1024字符
fw.write(content);
fw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally{
//关闭FileWriter
try {
if(null != fw)
fw.close();
} catch (IOException e) {
e.printStackTrace();
} }
}
2、扫描指定文件夹下所有的文件,准备压缩包的写入工作
这一部分依然是基本的IO操作,要注意安全关闭输入输出流,打开与关闭的顺序
/**
* @Description 获取文件夹中所有文件路径
* @author liuy-8
* @date 2015年5月27日 下午5:25:24
* @param folderPath 文件夹路径
* @return 文件夹中所有文件路径
*/
public static List<String> getFilesPath(String folderPath){
List<String> filesPath = new ArrayList<String>();
File folder = new File(folderPath);
File[] fileList = folder.listFiles();
for(File file : fileList){
if(file.isDirectory()){
//是文件夹,递归遍历
filesPath.addAll(getFilesPath(file.getPath()));
}else{
//是文件,加入文件列表
filesPath.add(file.getPath());
}
}
return filesPath;
} /**
* @Description 压缩文件夹
* @author liuy-8
* @date 2015年5月26日 下午1:42:00
* @param folderPath 文件夹路径
* @param zipFilePath 压缩文件路径
*/
public static void folder2Zip(String folderPath, String zipFilePath){
//获取当前系统文件分隔符
String fileSeparator = System.getProperty("file.separator");
//若传入路径最后没有文件分隔符,加上
if(folderPath.lastIndexOf(fileSeparator) != (folderPath.length() - 1)){
folderPath = folderPath + fileSeparator;
}
//获取文件夹下所有文件路径
List<String> filesPath = getFilesPath(folderPath);
//文件输出流
FileOutputStream fos = null;
//缓冲输出流
BufferedOutputStream bos = null;
//zip输出流
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(zipFilePath);
bos = new BufferedOutputStream(fos);
zos = new ZipOutputStream(bos);
for(String filePath : filesPath){
//将文件写入zip输出流
writeFile2Zip(folderPath, filePath, zos);
}
zos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
//关闭zip输出流
try {
if(null != zos){
zos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
//关闭缓冲输出流
try {
if(null != bos){
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
//关闭文件输出流
try {
if(null != fos){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、将文件依次写入zip输出流
在第二步已经用ZipOutputStream创建了压缩文件的输出流,这一步里,每个文件都要对应一个ZipEntry对象
要将这个对象加入到压缩文件的输出流中后再写入数据,并且写完数据必须在输出流中关闭该ZipEntry对象
这里有2个容易出错的地方:
一是ZipEntry对象需要一个路径,这个路径是相对于压缩文件夹的相对路径,用来保证子文件夹文件的顺利压入
二是往zip输出流中写入的字节的时候,要判断循环读取字节时文件输入流中读取了多少字节长度,读多少写多少,不然在文件尾部会出现错误数据
/**
* @Description 将文件写入zip输出流
* @author liuy-8
* @date 2015年5月27日 下午5:23:42
* @param folderPath 待压缩文件夹路径
* @param filePath 待写入文件
* @param zos zip输出流
*/
private static void writeFile2Zip(String folderPath, String filePath, ZipOutputStream zos){
//缓冲区
byte[] bs = new byte[1024];
//获取文件的相对路径
String entryName = filePath.substring(filePath.indexOf(folderPath) + folderPath.length());
//创建zip实体
ZipEntry entry = new ZipEntry(entryName);
//输入流
FileInputStream fis = null;
//缓冲输入流
BufferedInputStream bis = null;
try {
//将zip实体加入zip输出流
zos.putNextEntry(entry);
fis = new FileInputStream(filePath);
bis = new BufferedInputStream(fis);
//写入zip输出流
int len = 0;
while((len = bis.read(bs, 0, 1024)) > 0){
zos.write(bs, 0, len);
}
zos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally{
//关闭entity
try {
zos.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
//关闭BufferedInputStream
try {
if(null != bis){
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
//关闭FileInputStream
try {
if(null != fis){
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
此类已封装为GlodonFileUtil,有需要找我要即可
java原生文件打包的更多相关文章
- Java批量文件打包下载
经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...
- java将文件打包成ZIP压缩文件的工具类实例
package com.lanp; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...
- Java批量文件打包下载zip
网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /* * 另存为 */ @RequestMapping(" ...
- 【Java】Java批量文件打包下载zip
网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /* * 另存为 */ @Request ...
- java jar文件打包成exe(Launch4j使用说明)
在日常的项目中需要把jar打包成exe.怎样快速的实现此功能.下面通过Launch4j的使用方法来介绍整个打包过程. 第一步:生成jar文件 第二部:使用Launch4j 图来描述过,简单明了.一切尽 ...
- Java 实现文件上传、下载、打包、文件copy、文件夹copy。
文件and文件夹copy package org.test; import java.io.*; public class FileCopy { /** * 复制单个文件 * * @param old ...
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以 ...
- 把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
- 使用Eclipse把java文件打包成jar 含有第三方jar库的jar包
使用Eclipse把java文件打包成jar 含有第三方jar库的jar包 网上打包说用eclipse安装fat jar插件,但是貌似现在都不能用了,所以我只能按照eclipse自带的方法打包了. ...
随机推荐
- windows使用putty工具 进行【复制】,【粘贴】操作
#复制# 按住鼠标左键,执行选择,放开左键时完成复制 #粘贴# 点击鼠标右键,执行粘贴
- python数据类型,格式话输出
一.程序交互 name = input(“你的名字是:”) #用户输入,输入的任何东西都存储成str(字符串类型)的形式 二.注释的重要性 以后动辄几千行代码的时候,回过头再去看的时候,发现自己都看不 ...
- UML-2-迭代、进化和敏捷
1.UP UP:Unified Process,统一过程.RUP:Rational Unified Process,Rational 公司制定的UP,是对UP的精细化. UP的过程: 初始 不是需求, ...
- 金融量化分析-python量化分析系列之---使用python获取股票历史数据和实时分笔数据
财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据.历史分笔数据,本文对tushare的用法,已经存在的 ...
- C#中Using里使用单例的问题
又给自己挖了一个坑跳进去. KafkaManager使用单例模型获取到一个producer,然而自己代码里用的时候加了一个using using (var producer = KafkaManage ...
- Ionic3,懒加载(二)
Ionic懒加载: 普通的ionic项目中,创建好每一个Component页面后,都需要在app.module.ts中进行declaration(声明)后才能进行调用,而这样的声明方式,及在APP加载 ...
- 用 fmt格式化候时间
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <div ...
- Thinking in java源码下载链接
Thinking in java书上显示的下载源码到www.mindview.net站点,但是这个站点打不开了,后来找到真正的下载地址,贴于此. http://www.mindviewinc.com/ ...
- 微信小程序转百度小程序修改
百度小程序对比微信小程序(最初版):[设备]项里没有内存监控.iBeacon.wifi.蓝牙.用户截屏.手机联系人.NFC[位置]项里没有打开地图选择位置[界面]项里没有绘图功能.没有节点信息获取功能 ...
- [SDOI2013]刺客信条
Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的天赋,成为了杰出的刺 ...