我在做一個項目中,工程文件中有一個功能需要很多圖片,圖片與app一起打包下來的話有30+M,那麼我們就考慮另外下載壓縮包,我們將圖片取出,工程就只有4+M了,哈哈哈哈,呵呵,真恐怖。那麼這樣就涉及到另外下載壓縮包,以及壓縮包的解壓。
java的工具類裡面也包含的有對zip的處理。
代碼實現
復制代碼
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;
}
}
復制代碼
代碼分析
先說解壓,用ZipFile實例化壓縮文件,接下來對ZipFile進行處理。列舉出ZipFile中的元素,在用IO操作將ZipFile中的元素轉化成文件,如果是目錄,則創建目錄繼續操作。
壓縮,運用ZipOutputStream將文件轉成IO輸出流,再BufferedInputStream輸入流寫入進去。