`

java解压缩zip包

    博客分类:
  • java
阅读更多
package test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/**
*
* @author liangjw
* @desc 测试java打zip包和解压zip包
* 用java.util.zip下的类会出现乱码,换成org.apache.tools.zip没有乱码
*/
public class MyTestZip {
public static void main(String args[]) throws Exception{
MyTestZip mtz=new MyTestZip();
//mtz.zipFile("f://test", "f://testttt.zip");
mtz.upZipFile("f:\\testttt.zip","f:\\ttt");
}

/**
* 将指定目录压缩
* @param basePath 指定的目录的路径
* @param zipname 压缩后的存放路径
* @throws Exception
*/
public void zipFile(String basePath,String zipname) throws Exception{
ZipEntry ze = null;
byte[] buffer = new byte[1024];
int readLen = 0;
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipname));
for (File file : getFiles(new File(basePath))) {
System.out.println("ziping:" + file.getName());
ze = new ZipEntry(getRelativePath(file,basePath));
ze.setSize(file.length());
ze.setTime(file.lastModified());
zos.putNextEntry(ze);
InputStream in = new BufferedInputStream(new FileInputStream(file));
while ((readLen = in.read(buffer, 0, 1024)) != -1) {
zos.write(buffer, 0, readLen);
}
in.close();
}
zos.close();

}

/**
* 将给定的压缩文件进行解压,放到指定目录
* @param zipFilename 需要解压缩的文件
* @param dir 解压后文件存放的目录
*/
public void upZipFile(String zipFilename,String dir) throws Exception{
        ZipInputStream zin=new ZipInputStream(new FileInputStream(zipFilename));  
        ZipEntry ze=null;  
        byte[] buf=new byte[1024];  
        while((ze=zin.getNextEntry())!=null){  
            System.out.println("unziping:"+ze.getName());
            OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(dir,ze.getName())));  
            int readLen=0;  
            while ((readLen=zin.read(buf, 0, 1024))!=-1) {  
                os.write(buf, 0, readLen);  
            }  
            os.close();   
           
        }  
        zin.close();  

}

/**
* 根据给定的目录返回该文件夹下所有的文件(包括子目录) 如果给定的是文件则返回该文件
*
* @param file
*            给定的文件目录
* @return 所有文件的列表
*/
private static List<File> getFiles(File fileDir) {
List<File> listFiles = new LinkedList<File>();
// 判断给定的fileDir是否为文件,如果是则直接返回
if (fileDir.isFile()) {
listFiles.add(fileDir);
return listFiles;
}
// 如果是目录则遍历该目录
File[] files = fileDir.listFiles();
for (File file : files) {
if (file.isFile()) {
listFiles.add(file);
} else {
// 对方法进行递归调用
listFiles.addAll(getFiles(file));
}
}
return listFiles;
}

/**
* 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径
* @param file 实际的文件名 
* @param baseDir 根目录 
* @return
*/
private static String getRelativePath(File file, String baseDir) {
File base = new File(baseDir);
String filename = file.getName();
while(true){
file = file.getParentFile();
if(file==null)break;
if(file.equals(base))break;
else filename = file.getName() + "/" + filename;
}
return filename;
}

    /** 
    * 给定根目录,返回一个相对路径所对应的实际文件名. 
    * @param baseDir 指定根目录 
    * @param absFileName 相对路径名,来自于ZipEntry中的name 
    * @return java.io.File 实际的文件 
    */ 
    public static File getRealFileName(String baseDir, String absFileName){  
        //判断是否有下级目录,如果没有则将该文件直接new出来
    String[] dirs=absFileName.split("/");  
        File ret=new File(baseDir);  
        //有下级目录则先创建目录,再创建文件
        if(dirs.length>1){  
            for (int i = 0; i < dirs.length-1;i++) {  
                ret=new File(ret, dirs[i]);  
            }  
            if(!ret.exists())  
                ret.mkdirs();  
            ret=new File(ret, dirs[dirs.length-1]);  
            return ret;  
        }
        return new File(ret,absFileName);  
    }  

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics