1.Java多文件批量生成zip
/**
* 生成压缩包
* @param request
* @param campId
* @return
*/
public static String generateZip(HttpServletRequest request, String campId,
HttpServletResponse response){
//zip包存储路径
String zipName= campId+".zip";//自定义zip包的文件名
String zipFilePath = getAndSetAbsolutePath(request, Constants.ZipPath, zipName);//定义zip包存放路径+名字
//获取excel存储路径
String excelDir = getServerPath(request, Constants.ExcelPath);//获取要批量压缩的文件目录
// checkDir(excel);
//遍历excel存储路径
//获取pathName的File对象
File dirFile = new File(excelDir);
//获取此目录下的所有文件名与目录名
String[] fileList = dirFile.list();
//根据临时的zip压缩包路径,创建zip文件
File zip = new File(zipFilePath);
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
if (!zip.exists()){//创建zip包文件
zip.createNewFile();
}
//创建zip文件输出流
fos = new FileOutputStream(zip);
zos = new ZipOutputStream(fos);
//循环读取文件路径集合,获取每一个文件的路径
for(String fp : fileList){
File f = new File(excelDir, fp); //根据文件路径创建文件
zipFile(f, zos); //将每一个文件写入zip文件包内,即进行打包
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(zos != null){
// zos.closeEntry();
zos.close();
}
if(fos != null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return zipFilePath;
}
/**
* 封装压缩文件的方法
* @param inputFile
* @param zipoutputStream
*/
public static void zipFile(File inputFile,ZipOutputStream zipoutputStream) {
try {
if(inputFile.exists()) { //判断文件是否存在
if (inputFile.isFile()) { //判断是否属于文件,还是文件夹
//创建输入流读取文件
FileInputStream fis = new FileInputStream(inputFile);
BufferedInputStream bis = new BufferedInputStream(fis);
//将文件写入zip内,即将文件进行打包
ZipEntry ze = new ZipEntry(inputFile.getName()); //获取文件名
zipoutputStream.putNextEntry(ze);
//写入文件的方法,同上
byte [] b=new byte[1024];
long l=0;
while(l<inputFile.length()){
int j=bis.read(b,0,1024);
l+=j;
zipoutputStream.write(b,0,j);
}
//关闭输入输出流
fis.close();
bis.close();
} else { //如果是文件夹,则使用穷举的方法获取文件,写入zip
try {
File[] files = inputFile.listFiles();
for (int i = 0; i < files.length; i++) {
zipFile(files[i], zipoutputStream);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}