网上apache zip 示例代码如过江之鲫,不过基本都是支持FOR-EACH写法的高版本JDK,我这里写一个JDK1.4版本的用法,并附带了main调试。其实也没有啥大区别,大家都写的出。
import java.io.*;
import org.apache.tools.zip.*;
import java.util.Enumeration;
public class ZipUtil {
private static ZipFile zipFile;
private static ZipOutputStream zipOut; //压缩Zip
private static ZipEntry zipEntry;
private static int bufSize; //size of bytes
private static byte[] buf;
private static int readedBytes;
public static void doZip(String zipDirectory){//zipDirectoryPath:需要压缩的文件夹名
File file;
File zipDir;
zipDir = new File(zipDirectory);
String zipFileName = zipDirectory+ ".zip";//压缩后生成的zip文件名
File todelfile = new File(zipFileName);
if(todelfile.exists()){
todelfile.delete();
}
try{
zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName)));
zipOut.setEncoding("gbk");
//防止文件名乱码
handleDir(zipDir , zipOut);
System.out.println("zipfilename"+zipFileName);
zipOut.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
//由doZip调用,递归完成目录文件读取
private static void handleDir(File dir , ZipOutputStream zipOut)throws IOException{
InputStream fileIn;
File[] files;
files = dir.listFiles();
if(files.length == 0){//如果目录为空,则单独创建之.
//ZipEntry的isDirectory()方法中,目录以"/"结尾.
zipOut.putNextEntry(new ZipEntry(dir.toString() + "/"));
zipOut.closeEntry();
}
else{//如果目录不为空,则分别处理目录和文件.
for(int i=0;i<files.length;i++){
File fileName=files[i];
if(fileName.isDirectory()){
handleDir(fileName , zipOut);
}
else{
System.out.println(fileName);
if(!fileName.getName().endsWith("PDF")) continue;
fileIn = new FileInputStream(fileName);
//zipOut.putNextEntry(new ZipEntry(fileName.toString()));
//上面方法,会在zip包中包含整个文件夹结构
//下面方法,仅放进文件,不包含文件夹结构
zipOut.putNextEntry(new ZipEntry(fileName.getName()));
while((readedBytes = fileIn.read())>0){
zipOut.write( readedBytes);
}
zipOut.closeEntry();
}
}
}
}
public static void main(String[] args){
doZip("F:\\test\\test");
}
}
另外,1.4jdk不能用高版本的ant.jar,得去
https://archive.apache.org/dist/ant/binaries/
下载
apache-ant-1.7.1-bin.zip