Android 不解壓直接讀取zip包的方法

NO IMAGE

之前專案中遇到個需求,總監讓我們把從伺服器下載下來的資源不解壓直接讀取裡面的資源,這樣的話就省去了一個個校驗資源是否正確的步驟,聽著貌似有點道理。。。廢話不多說直接上程式碼。

目前我所試驗過的可以讀取的資源有文字、圖片、xml檔案。

文字:

zip包目錄結構:res/txt/data.json

檔案sd卡路徑:android.os.Environment.getExternalStorageDirectory() “/res.zip”


public static String readDataFile(String file) throws Exception {
  //擷取路徑的檔名 res
  String fileName = file.substring(file.length() - 9, file.length() - 4);
  ZipFile zf = new ZipFile(file);
  InputStream in = new BufferedInputStream(new FileInputStream(file));
  ZipInputStream zin = new ZipInputStream(in);
  ZipEntry ze;
  while ((ze = zin.getNextEntry()) != null) {
   if (ze.isDirectory()) {
    //Do nothing
   } else {
    if (ze.getName().equals(fileName   "/txt/data.json")) {
     BufferedReader br = new BufferedReader(
       new InputStreamReader(zf.getInputStream(ze)));
     String line;
     while ((line = br.readLine()) != null) {
      return line;
     }
     br.close();
    }
   }
  }
  zin.closeEntry();
  return "";
 }

上面方法比較簡單沒什麼好說的,大家理解就行,有點需要注意的就是在判斷是否是想要讀取的檔案的時候,這裡的路徑是以zip的壓縮目錄為根目錄做比較。也就是if (ze.getName().equals(fileName “/txt/data.json”)) 這句話中的fileName 當前值為res。最後返回讀取的內容String就完事了。

圖片和xml檔案的讀取都差不多,下面直接貼出程式碼了。

圖片:

zip包目錄結構:res/pic/haha.png

檔案sd卡路徑:android.os.Environment.getExternalStorageDirectory() “/res.zip”


public static Bitmap readGuidePic(String file, String ResId) throws Exception {
  String fileName = file.substring(file.length() - 9, file.length() - 4);
  ZipFile zf = new ZipFile(file);
  InputStream in = new BufferedInputStream(new FileInputStream(file));
  ZipInputStream zin = new ZipInputStream(in);
  ZipEntry ze;
  while ((ze = zin.getNextEntry()) != null) {
   if (ze.isDirectory()) {
    //Do nothing
   } else {
    Log.i("tag", "file - "   ze.getName()   " : "   ze.getSize()   " bytes");
    if (ze.getName().equals(fileName   "/pic/haha.png")) {
     InputStream is = zf.getInputStream(ze);
     Bitmap bitmap = BitmapFactory.decodeStream(is);
     return bitmap;
    }
   }
  }
  zin.closeEntry();
  return null;
 }

xml檔案:

zip包目錄結構:res/xml/app.xml

檔案sd卡路徑:android.os.Environment.getExternalStorageDirectory() “/res.zip”


public static InputStream readAppFile(String file) throws IOException {
  String fileName = file.substring(file.length() - 9, file.length() - 4);
  ZipFile zf = new ZipFile(file);
  InputStream in = new BufferedInputStream(new FileInputStream(file));
  ZipInputStream zin = new ZipInputStream(in);
  ZipEntry ze;
  while ((ze = zin.getNextEntry()) != null) {
   if (ze.isDirectory()) {
    //Do nothing
   } else {
    if (ze.getName().equals(fileName   "/xml/app.xml")) {
     InputStream inputStream = zf.getInputStream(ze);
     return inputStream;
    }
   }
  }
  zin.closeEntry();
  return null;
 }

以上這篇Android 不解壓直接讀取zip包的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援指令碼之家。

您可能感興趣的文章:

Android實現zip檔案壓縮及解壓縮的方法