java打包下载,下面的工具类新增了递归压缩,指定路径压缩的方法
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
*
* 压缩文件工具类
*
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class ZipUtils
{
/**
*
* 压缩文件夹或单个文件
*
* @param srcFile 目录或者单个文件url
* @param zipFile 压缩后的ZIP文件url
* @throws Exception
* @see [类、类#方法、类#成员]
*/
public static void doCompress(String srcFile, String zipFile)
throws Exception
{
doCompress(new File(srcFile), new File(zipFile));
}
/**
*
* 压缩文件夹或单个文件
*
* @param srcFile 目录或者单个文件
* @param destFile 压缩后的ZIP文件
* @throws Exception
* @see [类、类#方法、类#成员]
*/
public static void doCompress(File srcFile, File destFile)
throws Exception
{
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(destFile));
if (srcFile.isDirectory())
{
File[] files = srcFile.listFiles();
for (File file : files)
{
doCompress(file, out);
}
}
else
{
doCompress(srcFile, out);
}
}
/**
*
* 压缩单个文件
*
* @param pathname 文件完整url
* @param out ZipOutputStream
* @throws IOException
* @see [类、类#方法、类#成员]
*/
public static void doCompress(String pathname, ZipOutputStream out)
throws IOException
{
doCompress(new File(pathname), out);
}
/**
*
* 压缩单个文件
*
* @param file File实体类
* @param out ZipOutputStream
* @throws IOException
* @see [类、类#方法、类#成员]
*/
public static void doCompress(File file, ZipOutputStream out)
throws IOException
{
if (file.exists())
{
byte[] buffer = new byte[1024];
FileInputStream fis = new FileInputStream(file);
out.putNextEntry(new ZipEntry(file.getName()));
int len = 0;
// 读取文件的内容,打包到zip文件
while ((len = fis.read(buffer)) > 0)
{
out.write(buffer, 0, len);
}
out.flush();
out.closeEntry();
fis.close();
}
}
/**
* 递归压缩文件
*
* @param source 源路径,可以是文件,也可以目录
* @param destinct 目标路径,压缩文件名
* @throws IOException
*/
@SuppressWarnings("rawtypes")
public static void compressRecursion(String source, String destinct)
throws IOException
{
List fileList = loadFilename(new File(source));
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(destinct)));
byte[] buffere = new byte[8192];
int length;
BufferedInputStream bis;
for (int i = 0; i < fileList.size(); i++)
{
File file = (File)fileList.get(i);
zos.putNextEntry(new ZipEntry(getEntryName(source, file)));
bis = new BufferedInputStream(new FileInputStream(file));
while (true)
{
length = bis.read(buffere);
if (length == -1)
break;
zos.write(buffere, 0, length);
}
bis.close();
zos.closeEntry();
}
zos.close();
}
/**
* 递归压缩文件
*
* @param source 要压缩的文件夹或文件的列表
* @param destinct 目标路径,压缩文件名
* @throws IOException
*/
@SuppressWarnings("rawtypes")
public static void compressRecursion(List<String> primaryPath, String destinct)
throws IOException
{
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(destinct)));
for (String path : primaryPath)
{
List fileList = loadFilename(new File(path));
byte[] buffere = new byte[8192];
int length;
BufferedInputStream bis;
for (int i = 0; i < fileList.size(); i++)
{
File file = (File)fileList.get(i);
zos.putNextEntry(new ZipEntry(getEntryName(path, file)));
bis = new BufferedInputStream(new FileInputStream(file));
while (true)
{
length = bis.read(buffere);
if (length == -1)
break;
zos.write(buffere, 0, length);
}
bis.close();
zos.closeEntry();
}
}
zos.close();
}
/**
* 递归压缩文件
*
* @param source 要压缩的文件夹或文件的列表
* @param destinct 目标路径,压缩文件名
* @throws IOException
*/
@SuppressWarnings("rawtypes")
public static void compressRecursion(List<String> primaryPath, ZipOutputStream zos)
throws IOException
{
for (String path : primaryPath)
{
List fileList = loadFilename(new File(path));
byte[] buffere = new byte[8192];
int length;
BufferedInputStream bis;
for (int i = 0; i < fileList.size(); i++)
{
File file = (File)fileList.get(i);
zos.putNextEntry(new ZipEntry(getEntryName(path, file)));
bis = new BufferedInputStream(new FileInputStream(file));
while (true)
{
length = bis.read(buffere);
if (length == -1)
break;
zos.write(buffere, 0, length);
}
bis.close();
zos.closeEntry();
}
}
zos.close();
}
/**
*
* 递归压缩文件并重命名
* @param zipFiles
* 文件路径新文件名封装实体
* @param zos
* @throws IOException
* @see [类、类#方法、类#成员]
*/
@SuppressWarnings("rawtypes")
public static void compressRecursionRename(List<ZipFile> zipFiles, ZipOutputStream zos)
throws IOException
{
int j=0;
for (ZipFile zipFile : zipFiles)
{
j++;
List fileList = loadFilename(new File(zipFile.getPhysicalFilePath()));
byte[] buffere = new byte[8192];
int length;
BufferedInputStream bis;
for (int i = 0; i < fileList.size(); i++)
{
File file = (File)fileList.get(i);
zos.putNextEntry(new ZipEntry((j)+"_"+zipFile.getNodeTypefileName()));
bis = new BufferedInputStream(new FileInputStream(file));
while (true)
{
length = bis.read(buffere);
if (length == -1)
break;
zos.write(buffere, 0, length);
}
bis.close();
zos.closeEntry();
}
}
zos.close();
}
/**
* 递归获得该文件下所有文件名(不包括目录名)
*
* @param file
* @return
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public static List loadFilename(File file)
{
List filenameList = new ArrayList();
if (file.isFile())
{
filenameList.add(file);
}
if (file.isDirectory())
{
for (File f : file.listFiles())
{
filenameList.addAll(loadFilename(f));
}
}
return filenameList;
}
/**
* 获得zip entry 字符串
*
* @param base
* @param file
* @return
*/
public static String getEntryName(String base, File file)
{
File baseFile = new File(base);
String filename = file.getPath();
// int index=filename.lastIndexOf(baseFile.getName());
if (baseFile.getParentFile().getParentFile() == null)
return filename.substring(baseFile.getParent().length());
return filename.substring(baseFile.getParent().length() + 1);
}
/**
*
* 压缩指定路径的文件
*
* @param primaryPath 指定的所有文件路径
* @param zipFilePath 要解压到的文件路径以及全文件名
* @throws FileNotFoundException,Exception
* @see [类、类#方法、类#成员]
*/
public static void compressUseAppointPath(List<String> primaryPath, String zipFilePath)
throws FileNotFoundException, Exception
{
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath));
byte[] buffere = new byte[8192];
int length;
BufferedInputStream bis;
for (String path : primaryPath)
{
File file = new File(path);
zos.putNextEntry(new ZipEntry(file.getName()));
bis = new BufferedInputStream(new FileInputStream(file));
while (true)
{
length = bis.read(buffere);
if (length == -1)
break;
zos.write(buffere, 0, length);
}
bis.close();
zos.closeEntry();
}
zos.close();
}
/**
*
* 压缩指定文件夹的所有文件——不带文件夹
*
* @param primaryPath
* @param zipFilePath
* @throws FileNotFoundException,Exception
* @see [类、类#方法、类#成员]
*/
public static void compressUseAppointDirPath(List<String> primaryPath, String zipFilePath)
throws FileNotFoundException, Exception
{
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath));
byte[] buffere = new byte[8192];
int length;
BufferedInputStream bis;
for (String path : primaryPath)
{
File file = new File(path);
if (file.isFile())
{
zos.putNextEntry(new ZipEntry(file.getName()));
bis = new BufferedInputStream(new FileInputStream(file));
while (true)
{
length = bis.read(buffere);
if (length == -1)
break;
zos.write(buffere, 0, length);
}
bis.close();
zos.closeEntry();
}
if (file.isDirectory())
{
for (File f : file.listFiles())
{
zos.putNextEntry(new ZipEntry(f.getName()));
bis = new BufferedInputStream(new FileInputStream(f));
while (true)
{
length = bis.read(buffere);
if (length == -1)
break;
zos.write(buffere, 0, length);
}
bis.close();
zos.closeEntry();
}
}
}
zos.close();
}
public static void main(String[] args)
throws FileNotFoundException, Exception
{
List<String> primaryPath = new ArrayList<String>();
primaryPath.add("D:/hsfile/contractfile/PJ1503902085962/2a9a091485214259bdc3e184811de72e");
primaryPath.add("D:\\test1.csv");
primaryPath.add("D:\\aaa.xls");
primaryPath.add("D:\\temp2.pdf");
compressUseAppointDirPath(primaryPath, "D:\\mytest.zip");
}
}