在Android资源中解压文件

我把一个zip文件中的Android资产。 我如何提取Android内部存储的文件? 我知道如何获取文件,但我不知道如何提取它。 这是我的代码

Util zip ;

zip = new Util();

zip.copyFileFromAsset(this, "myfile.zip", getExternalStorage()+ "/android/data/edu.binus.profile/");

感谢您的帮助:D

Solutions Collecting From Web of "在Android资源中解压文件"

这段代码将帮助你….只要通过zipfile文件的位置和你想提取的文件保存到这个类的位置,同时使一个对象…并调用解压缩方法…

  public class Decompress { private String zip; private String loc; public Decompress(String zipFile, String location) { zip = zipFile; loc = location; dirChecker(""); } public void unzip() { try { FileInputStream fin = new FileInputStream(zip); ZipInputStream zin = new ZipInputStream(fin); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.v("Decompress", "Unzipping " + ze.getName()); if(ze.isDirectory()) { dirChecker(ze.getName()); } else { FileOutputStream fout = new FileOutputStream(loc + ze.getName()); for (int c = zin.read(); c != -1; c = zin.read()) { fout.write(c); } zin.closeEntry(); fout.close(); } } zin.close(); } catch(Exception e) { Log.e("Decompress", "unzip", e); } } private void dirChecker(String dir) { File f = new File(_location + dir); if(!f.isDirectory()) { f.mkdirs(); } } } 

基于Sreedev R解决scheme,我添加了从资产中读取文件并使用缓冲区的选项:

 package com.pixoneye.api.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import android.content.Context; import android.util.Log; public class Decompress { private static final int BUFFER_SIZE = 1024 * 10; private static final String TAG = "Decompress"; public static void unzipFromAssets(Context context, String zipFile, String destination) { try { if (destination == null || destination.length() == 0) destination = context.getFilesDir().getAbsolutePath(); InputStream stream = context.getAssets().open(zipFile); unzip(stream, destination); } catch (IOException e) { e.printStackTrace(); } } public static void unzip(String zipFile, String location) { try { FileInputStream fin = new FileInputStream(zipFile); unzip(fin, location); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void unzip(InputStream stream, String destination) { dirChecker(destination, ""); byte[] buffer = new byte[BUFFER_SIZE]; try { ZipInputStream zin = new ZipInputStream(stream); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.v(TAG, "Unzipping " + ze.getName()); if (ze.isDirectory()) { dirChecker(destination, ze.getName()); } else { File f = new File(destination + ze.getName()); if (!f.exists()) { FileOutputStream fout = new FileOutputStream(destination + ze.getName()); int count; while ((count = zin.read(buffer)) != -1) { fout.write(buffer, 0, count); } zin.closeEntry(); fout.close(); } } } zin.close(); } catch (Exception e) { Log.e(TAG, "unzip", e); } } private static void dirChecker(String destination, String dir) { File f = new File(destination + dir); if (!f.isDirectory()) { boolean success = f.mkdirs(); if (!success) { Log.w(TAG, "Failed to create folder " + f.getName()); } } } } 

也许你应该尝试使用FileOutputStream和zip文件中的inputstream结合使用。 用一个包文件,这应该工作。

从这个问题引用@wordy:

 PackageManager pm = context.getPackageManager(); String apkFile = pm.getApplicationInfo(context.getPackageName(), 0).sourceDir; ZipFile zipFile = new ZipFile(apkFile); ZipEntry entry = zipFile.getEntry("assets/FILENAME"); myInput = zipFile.getInputStream(entry); myOutput = new FileOutputStream(file); byte[] buffer = new byte[1024*4]; int length; int total = 0; int counter = 1; while ((length = myInput.read(buffer)) > 0) { total += length; counter++; if (counter % 32 == 0) { publishProgress(total); } myOutput.write(buffer, 0, length); } 

看起来像ProGuard可能有问题,但希望代码示例为您工作。

我还没有testing过,但是在做一个OCR项目的时候,我遇到了这个库 ,那里有解压从网上下载的文件的方法。 确切的解压缩文件的方法是在这个类下findinstallZipFromAssets(String sourceFilename,File destinationDir,File destinationFile)希望这是你正在寻找

您还可以使用提供诸如encryption等附加function的zip4j外部库。 另外,它具有将文件提取到提供path的特定位置的function。