Android -- 壓縮與解壓檔案

來源:互聯網
上載者:User

Android -- 壓縮與解壓檔案
我在做一個項目中,工程檔案中有一個功能需要很多圖片,圖片與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輸入資料流寫入進去。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.