在Java中操作Zip文件,壓縮/解壓
Posted on 2006-04-06 10:25 微薄社區(qū) 閱讀(400) 評(píng)論(0) 編輯 收藏 所屬分類: Java數(shù)據(jù)訪問技術(shù)
本文版權(quán)歸原作者,中國(guó)JAVA手機(jī)網(wǎng)收錄本文的目的是讓更多人閱讀到此文章。轉(zhuǎn)載請(qǐng)注明出處為中國(guó)JAVA手機(jī)網(wǎng)<www.cnjm.net>
[轉(zhuǎn)載于IT狐] 可隨意轉(zhuǎn)載,但請(qǐng)注明出處及作者 SonyMusic 2003.05.28 ========================================================================== 在Java中操作Zip文件,壓縮/解壓 package test.nothing; import java.io.*; import java.util.*; import java.util.zip.*; import com.beaconsystem.util.*; import junit.framework.TestCase; /** * @author SonyMusic * * 用于測(cè)試java.util.zip包壓縮和解壓縮文件zip文件的例子. * 基于JUnit編寫,包括兩個(gè)test方法,和三個(gè)輔助方法. * 注意到使用過程中操作的全是流,所以不僅僅可以讀寫文件。這只是一個(gè)簡(jiǎn)單的例子. */ public class TestZipOp extends TestCase { /** * Constructor for TestZipOp. * @param arg0 */ public TestZipOp(String arg0) { super(arg0); } public static void main(String[] args) { junit.textui.TestRunner.run(TestZipOp.class); } /** * zip壓縮功能測(cè)試. * 將d:\temp\zipout目錄下的所有文件連同子目錄壓縮到d:\temp\out.zip. * @throws Exception */ public void testCreateZip() throws Exception{ //壓縮baseDir下所有文件,包括子目錄 String baseDir="d:\temp\zipout"; List fileList=getSubFiles(new File(baseDir)); //壓縮文件名 ZipOutputStream zos=new ZipOutputStream(new FileOutputStream("d:\temp\out.zip")); ZipEntry ze=null; byte[] buf=new byte[1024]; int readLen=0; for (int i = 0; i <fileList.size(); i++) { File f=(File)fileList.get(i); System.out.print("Adding: "+f.getPath()+f.getName()); //創(chuàng)建一個(gè)ZipEntry,并設(shè)置Name和其它的一些屬性 ze=new ZipEntry(getAbsFileName(baseDir, f)); ze.setSize(f.length()); ze.setTime(f.lastModified()); //將ZipEntry加到zos中,再寫入實(shí)際的文件內(nèi)容 zos.putNextEntry(ze); InputStream is=new BufferedInputStream(new FileInputStream(f)); while ((readLen=is.read(buf, 0, 1024))!=-1) { zos.write(buf, 0, readLen); } is.close(); System.out.println(" ? done..."); } zos.close(); } /** * 測(cè)試解壓縮功能. * 將d:\download\test.zip文件解壓到d:\temp\zipout目錄下. * @throws Exception */ public void testReadZip() throws Exception{ //InputStream is=new BufferedInputStream(new FileInputStream()); String baseDir="d:\temp\zipout"; ZipFile zfile=new ZipFile("d:\download\Test.zip"); System.out.println(zfile.getName()); Enumeration zList=zfile.entries(); ZipEntry ze=null; byte[] buf=new byte[1024]; while(zList.hasMoreElements()){ //從ZipFile中得到一個(gè)ZipEntry ze=(ZipEntry)zList.nextElement(); if(ze.isDirectory()){ System.out.println("Dir: "+ze.getName()+" skipped.."); continue; } System.out.println("Extracting: "+ze.getName()+"t"+ze.getSize()+"t"+ze.getCompressedSize()); //以ZipEntry為參數(shù)得到一個(gè)InputStream,并寫到OutputStream中 OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(baseDir, ze.getName()))); InputStream is=new BufferedInputStream(zfile.getInputStream(ze)); int readLen=0; while ((readLen=is.read(buf, 0, 1024))!=-1) { os.write(buf, 0, readLen); } is.close(); os.close(); System.out.println("Extracted: "+ze.getName()); } zfile.close(); } /** * 給定根目錄,返回一個(gè)相對(duì)路徑所對(duì)應(yīng)的實(shí)際文件名. * @param baseDir 指定根目錄 * @param absFileName 相對(duì)路徑名,來自于ZipEntry中的name * @return java.io.File 實(shí)際的文件 */ private File getRealFileName(String baseDir, String absFileName){ String[] dirs=Regex.split("/", absFileName); //System.out.println(dirs.length); 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; } /** * 給定根目錄,返回另一個(gè)文件名的相對(duì)路徑,用于zip文件中的路徑. * @param baseDir java.lang.String 根目錄 * @param realFileName java.io.File 實(shí)際的文件名 * @return 相對(duì)文件名 */ private String getAbsFileName(String baseDir, File realFileName){ File real=realFileName; File base=new File(baseDir); String ret=real.getName(); while (true) { real=real.getParentFile(); if(real==null) break; if(real.equals(base)) break; else{ ret=real.getName()+"/"+ret; } } return ret; } /** * 取得指定目錄下的所有文件列表,包括子目錄. * @param baseDir File 指定的目錄 * @return 包含java.io.File的List */ private List getSubFiles(File baseDir){ List ret=new ArrayList(); //File base=new File(baseDir); File[] tmp=baseDir.listFiles(); for (int i = 0; i <tmp.length; i++) { if(tmp[i].isFile()){ ret.add(tmp[i]); } if(tmp[i].isDirectory()){ ret.addAll(getSubFiles(tmp[i])); } } return ret; } } |