做Java Web開發,有時候遇到將多個文件或者文件夾壓縮成一個.zip文件,供前端下載。Java的JDK中提供一個java.util.zip的接口,供大家使用。如下圖:

圖上就是Java 的JDK提供的接口,但是壓縮文件或者文件夾的時候,怎么使用上面的接口呢?下面我給出幾個相關的接口,這些接口是下面壓縮文件或者文件夾過程中使用到的。
java.util.zip.ZipEntry;
java.util.zip.ZipOutputStream;
下面的壓縮過程主要是通過這兩個接口壓縮文件或者文件夾;
下面先給出源碼,后面詳細介紹的接口中的方法:
package ZIPUtil;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 學習使用java.util.zip壓縮文件或者文件夾
* @author lhm
*
*/
public class ZIPUtil {
/**
* @param args 主方法
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//第一個參數是需要壓縮的源路徑;第二個參數是壓縮文件的目的路徑,這邊需要將壓縮的文件名字加上去
compress("H:\\zip/scala","H:\\zip/oo.zip");
}
/**s
* 壓縮文件
* @param srcFilePath 壓縮源路徑
* @param destFilePath 壓縮目的路徑
*/
public static void compress(String srcFilePath, String destFilePath) {
//
File src = new File(srcFilePath);
if (!src.exists()) {
throw new RuntimeException(srcFilePath + "不存在");
}
File zipFile = new File(destFilePath);
try {
FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
String baseDir = "";
compressbyType(src, zos, baseDir);
zos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 按照原路徑的類型就行壓縮。文件路徑直接把文件壓縮,
* @param src
* @param zos
* @param baseDir
*/
private static void compressbyType(File src, ZipOutputStream zos,String baseDir) {
if (!src.exists())
return;
System.out.println("壓縮路徑" + baseDir + src.getName());
//判斷文件是否是文件,如果是文件調用compressFile方法,如果是路徑,則調用compressDir方法;
if (src.isFile()) {
//src是文件,調用此方法
compressFile(src, zos, baseDir);
} else if (src.isDirectory()) {
//src是文件夾,調用此方法
compressDir(src, zos, baseDir);
}
}
/**
* 壓縮文件
*/
private static void compressFile(File file, ZipOutputStream zos,String baseDir) {
if (!file.exists())
return;
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ZipEntry entry = new ZipEntry(baseDir + file.getName());
zos.putNextEntry(entry);
int count;
byte[] buf = new byte[1024];
while ((count = bis.read(buf)) != -1) {
zos.write(buf, 0, count);
}
bis.close();
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 壓縮文件夾
*/
private static void compressDir(File dir, ZipOutputStream zos,String baseDir) {
if (!dir.exists())
return;
File[] files = dir.listFiles();
if(files.length == 0){
try {
zos.putNextEntry(new ZipEntry(baseDir + dir.getName()+File.separator));
} catch (IOException e) {
e.printStackTrace();
}
}
for (File file : files) {
compressbyType(file, zos, baseDir + dir.getName() + File.separator);
}
}
}
java.util.zip-壓縮流程:
先將文件加載到文件流FileInputStream中,再將文件流輸入到ZipOutputStream;
源文件路徑:H:\\zip/scala,目的壓縮文件zip的路徑:H:\\zip/oo.zip

