效果:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* 完成文件的壓縮與解壓縮
* 壓縮:
* 構造方法中傳入壓縮文件路徑
* 調用方法時傳入文件列表,可以單/多文件,文件目錄允許爲空
* 解壓縮:
* 靜態方法,傳入壓縮文件路徑和解壓輸出目錄
* @author M
* @version zipBeta-1.0
*/
public class ZipIo {
private File zipFile;
static final int BUFFERSIZE = 4096;
public ZipIo(String pathname){
zipFile = new File(pathname);
}
/**
* 文件壓縮方法
* @param filelist <文件列表>
* @throws IOException
*/
public void compressFilelist(String[] filelist) throws IOException{
ZipOutputStream zipOutputStream = null;
zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile));
// Set<String> staffsSet = new HashSet<>(Arrays.asList(filelist));
for(String file : filelist){
String basedir = "";
//判斷文件類型:目錄or文件
compressByType(new File(file),zipOutputStream,basedir);
}
zipOutputStream.close();
}
/**
* 根據不同文件類型選擇不同方法
* @param srcfFile <待壓縮的文件名>
* @param zipOutputStream <輸出流>
* @param basedir <文件在壓縮文件中的路徑>
* @throws IOException
*/
private void compressByType(File srcfFile, ZipOutputStream zipOutputStream, String basedir) throws IOException {
if(srcfFile.isDirectory()){
compressDirectory(srcfFile,zipOutputStream,basedir);
}else {
compressFile(srcfFile,zipOutputStream,basedir);
}
}
/**
* 文件的壓縮方式
* @param srcfFile <待壓縮的文件名>
* @param zipOutputStream <輸出流>
* @param basedir <文件在壓縮文件中的路徑>
* @throws IOException
*/
private void compressFile(File srcfFile, ZipOutputStream zipOutputStream, String basedir) throws IOException {
if(!srcfFile.exists()){
return;
}
ZipEntry zipEntry = null;
zipEntry = new ZipEntry(basedir+srcfFile.getName());
FileInputStream fis = new FileInputStream(srcfFile);
zipOutputStream.putNextEntry(zipEntry);
int temp;
byte[] b = new byte[BUFFERSIZE];
while((temp = fis.read(b))!=-1){
zipOutputStream.write(b,0,temp);
}
fis.close();
}
/**
* 文件夾的壓縮方式
* @param srcfFile
* @param zipOutputStream
* @param basedir
* @throws IOException
*/
private void compressDirectory(File srcfFile, ZipOutputStream zipOutputStream, String basedir) throws IOException {
if(!srcfFile.exists()){
return;
}
File[] files = srcfFile.listFiles();
//若爲空文件夾
if(files.length==0)
zipOutputStream.putNextEntry(new ZipEntry(basedir+srcfFile.getName()+"/"));
//非空文件夾繼續遞歸,判斷下一級目錄類型
for(File file : files){
compressByType(file, zipOutputStream, basedir+srcfFile.getName()+File.separator);
}
}
/**
* 解壓縮文件方法
* @param zipPath <壓縮文件目錄>
* @param outputPath <解壓目錄>
* @throws IOException
*/
public static void unzipFiles(String zipPath, String outputPath) throws IOException{
ZipInputStream zis = null;
ZipEntry zipEntry = null;
zis = new ZipInputStream(new FileInputStream(zipPath));
while((zipEntry = zis.getNextEntry())!=null){
//獲取每個zipentry的路徑,創建相應的文件夾
File path = new File(outputPath + File.separator + zipEntry.getName());
File parpath = new File(path.getParentFile().getPath());
if(zipEntry.isDirectory()){
path.mkdirs();
continue;
}else {
parpath.mkdirs();
}
//將文件解壓到相應文件夾下
FileOutputStream fod = new FileOutputStream(outputPath + File.separator + zipEntry.getName());
int temp;
byte[] b = new byte[BUFFERSIZE];
while((temp=zis.read(b))!=-1){
fod.write(b,0,temp);
}
fod.close();
}
zis.close();
}
}