我在作一個項目中,工程文件中有一個功能須要不少圖片,圖片與app一塊兒打包下來的話有30+M,那麼咱們就考慮另外下載壓縮包,咱們將圖片取出,工程就只有4+M了,哈哈哈哈,呵呵,真恐怖。那麼這樣就涉及到另外下載壓縮包,以及壓縮包的解壓。java
java的工具類裏面也包含的有對zip的處理。ios
代碼實現 緩存
public class Util { public static final String ZIP_FILENAME = "/data/data/com.yydcdut.unzip/new_ios_7_icons_by_sunkotora-d68qbmo.zip";//須要解壓縮的文件名 public static final String ZIP_DIR = "/data/data/com.yydcdut.unzip/";//須要壓縮的文件夾 public static final String UN_ZIP_DIR = "/data/data/com.yydcdut.unzip/zzip/";//要解壓的文件目錄 //上面兩個變量好像說反了。 public static final int BUFFER = 1024 ;//緩存大小 /** * zip壓縮功能. * 壓縮baseDir(文件夾目錄)下全部文件,包括子目錄 * @throws Exception */ public static void zipFile(String baseDir,String fileName) throws Exception{ List fileList=getSubFiles(new File(baseDir)); ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(fileName)); ZipEntry ze=null; byte[] buf=new byte[BUFFER]; int readLen=0; for(int i = 0; i <fileList.size(); i++) { File f=(File)fileList.get(i); ze=new ZipEntry(getAbsFileName(baseDir, f)); ze.setSize(f.length()); ze.setTime(f.lastModified()); zos.putNextEntry(ze); InputStream is=new BufferedInputStream(new FileInputStream(f)); while ((readLen=is.read(buf, 0, BUFFER))!=-1) { zos.write(buf, 0, readLen); } is.close(); } zos.close(); } /** * 給定根目錄,返回另外一個文件名的相對路徑,用於zip文件中的路徑. * @param baseDir java.lang.String 根目錄 * @param realFileName java.io.File 實際的文件名 * @return 相對文件名 */ private static 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 static List getSubFiles(File baseDir){ List ret=new ArrayList(); 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; } /** * 解壓縮功能. * 將ZIP_FILENAME文件解壓到ZIP_DIR目錄下. * @throws Exception */ public static void upZipFile() throws Exception{ ZipFile zfile=new ZipFile(ZIP_FILENAME); Enumeration zList=zfile.entries(); ZipEntry ze=null; byte[] buf=new byte[1024]; while(zList.hasMoreElements()){ ze=(ZipEntry)zList.nextElement(); if(ze.isDirectory()){ File f=new File(ZIP_DIR+ze.getName()); f.mkdir(); continue; } OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(ZIP_DIR, 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(); } zfile.close(); } /** * 給定根目錄,返回一個相對路徑所對應的實際文件名. * @param baseDir 指定根目錄 * @param absFileName 相對路徑名,來自於ZipEntry中的name * @return java.io.File 實際的文件 */ public static File getRealFileName(String baseDir, String absFileName){ 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 ret; } }
代碼分析 app
先說解壓,用ZipFile實例化壓縮文件,接下來對ZipFile進行處理。列舉出ZipFile中的元素,在用IO操做將ZipFile中的元素轉化成文件,若是是目錄,則建立目錄繼續操做。工具
壓縮,運用ZipOutputStream將文件轉成IO輸出流,再BufferedInputStream輸入流寫入進去。spa
我是天王蓋地虎的分割線 code
源代碼:http://pan.baidu.com/s/1dD1Qx01blog
unzip.zip圖片
轉載請註明出處:http://www.cnblogs.com/yydcdutip