转载自:http://orz.iteye.com/blog/110842
- importjava.io.BufferedInputStream;
- importjava.io.BufferedOutputStream;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importjava.util.ArrayList;
- importjava.util.Enumeration;
- importjava.util.List;
- importjava.util.zip.ZipEntry;
- importjava.util.zip.ZipFile;
- importjava.util.zip.ZipOutputStream;
- publicclassZipToFile{
- publicstaticfinalStringZIP_FILENAME="C:\\XJPDA.zip";//需要解压缩的文件名
- publicstaticfinalStringZIP_DIR="C:\\XJPDA\\";//需要压缩的文件夹
- publicstaticfinalStringUN_ZIP_DIR="C:\\";//要解压的文件目录
- publicstaticfinalintBUFFER=1024;//缓存大小
- /**
- *zip压缩功能.
- *压缩baseDir(文件夹目录)下所有文件,包括子目录
- *@throwsException
- */
- publicstaticvoidzipFile(StringbaseDir,StringfileName)throwsException{
- ListfileList=getSubFiles(newFile(baseDir));
- ZipOutputStreamzos=newZipOutputStream(newFileOutputStream(fileName));
- ZipEntryze=null;
- byte[]buf=newbyte[BUFFER];
- intreadLen=0;
- for(inti=0;i<fileList.size();i++){
- Filef=(File)fileList.get(i);
- ze=newZipEntry(getAbsFileName(baseDir,f));
- ze.setSize(f.length());
- ze.setTime(f.lastModified());
- zos.putNextEntry(ze);
- InputStreamis=newBufferedInputStream(newFileInputStream(f));
- while((readLen=is.read(buf,0,BUFFER))!=-1){
- zos.write(buf,0,readLen);
- }
- is.close();
- }
- zos.close();
- }
- /**
- *给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
- *@parambaseDirjava.lang.String根目录
- *@paramrealFileNamejava.io.File实际的文件名
- *@return相对文件名
- */
- privatestaticStringgetAbsFileName(StringbaseDir,FilerealFileName){
- Filereal=realFileName;
- Filebase=newFile(baseDir);
- Stringret=real.getName();
- while(true){
- real=real.getParentFile();
- if(real==null)
- break;
- if(real.equals(base))
- break;
- else
- ret=real.getName()+"/"+ret;
- }
- returnret;
- }
- /**
- *取得指定目录下的所有文件列表,包括子目录.
- *@parambaseDirFile指定的目录
- *@return包含java.io.File的List
- */
- privatestaticListgetSubFiles(FilebaseDir){
- Listret=newArrayList();
- File[]tmp=baseDir.listFiles();
- for(inti=0;i<tmp.length;i++){
- if(tmp[i].isFile())
- ret.add(tmp[i]);
- if(tmp[i].isDirectory())
- ret.addAll(getSubFiles(tmp[i]));
- }
- returnret;
- }
- /**
- *解压缩功能.
- *将ZIP_FILENAME文件解压到ZIP_DIR目录下.
- *@throwsException
- */
- publicstaticvoidupZipFile()throwsException{
- ZipFilezfile=newZipFile(ZIP_FILENAME);
- EnumerationzList=zfile.entries();
- ZipEntryze=null;
- byte[]buf=newbyte[1024];
- while(zList.hasMoreElements()){
- ze=(ZipEntry)zList.nextElement();
- if(ze.isDirectory()){
- Filef=newFile(ZIP_DIR+ze.getName());
- f.mkdir();
- continue;
- }
- OutputStreamos=newBufferedOutputStream(newFileOutputStream(getRealFileName(ZIP_DIR,ze.getName())));
- InputStreamis=newBufferedInputStream(zfile.getInputStream(ze));
- intreadLen=0;
- while((readLen=is.read(buf,0,1024))!=-1){
- os.write(buf,0,readLen);
- }
- is.close();
- os.close();
- }
- zfile.close();
- }
- /**
- *给定根目录,返回一个相对路径所对应的实际文件名.
- *@parambaseDir指定根目录
- *@paramabsFileName相对路径名,来自于ZipEntry中的name
- *@returnjava.io.File实际的文件
- */
- publicstaticFilegetRealFileName(StringbaseDir,StringabsFileName){
- String[]dirs=absFileName.split("/");
- Fileret=newFile(baseDir);
- if(dirs.length>1){
- for(inti=0;i<dirs.length-1;i++){
- ret=newFile(ret,dirs[i]);
- }
- if(!ret.exists())
- ret.mkdirs();
- ret=newFile(ret,dirs[dirs.length-1]);
- returnret;
- }
- returnret;
- }
- }
不过上面存在中文问题
是因为java.util.zip下的格式转换有问题
将
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
改成
import org.apache.tools.zip.*;
即可!
apache里修正了这一现象。