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();
}
}