在Android应用程序中解压缩sd卡上的压缩文件

我有一个压缩密码保护在Android模拟器上的SD卡上保存的video文件。 现在我想通过代码在SD卡上解压缩该video文件。 我怎样才能实现这一目标? 任何帮助或代码? 提前致谢

    import android.util.Log; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** * * @author jon */ public class Decompress { private String _zipFile; private String _location; public Decompress(String zipFile, String location) { _zipFile = zipFile; _location = location; _dirChecker(""); } public void unzip() { try { FileInputStream fin = new FileInputStream(_zipFile); 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(_location + 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(); } } } 

    在你的情况下::

     String zipFilename = Environment.getExternalStorageDirectory() + "/files.zip"; String unzipLocation = Environment.getExternalStorageDirectory() + "/unzipped/"; Decompress d = new Decompress(zipFilename, unzipLocation); d.unzip(); 

    要解压缩受密码保护的文件,请使用此库:

    http://www.lingala.net/zip4j/download.php

    它很容易。

     ZipFile zipFile = new ZipFile(YourZipFile); if(zipFile.isEncrypted()) zipFile.setPassword(Password); zipFile.extractAll(Destination); 

    这是使用Apache的IOUtils.copy()复制文件并finally阻止的稍微更清晰的Samir代码版本。 如果存档中有大文件,那么最好使用IOUtils.copyLarge()

     import org.apache.commons.io.IOUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ZipUtils { public static void unzip(InputStream is, File path) { checkDir(path); ZipInputStream zis = null; FileOutputStream fos = null; try { zis = new ZipInputStream(is); ZipEntry ze; while ((ze = zis.getNextEntry()) != null) { File entryFile = new File(path, ze.getName()); if (ze.isDirectory()) { checkDir(entryFile); } else { fos = new FileOutputStream(entryFile); IOUtils.copy(zis, fos); fos.close(); fos = null; } zis.closeEntry(); } } catch (IOException e) { e.printStackTrace(); } finally { if (zis != null) { try { zis.close(); } catch (IOException ignore) { } } if (fos != null) { try { fos.close(); } catch (IOException ignore) { } } } } private static void checkDir(File path) { if (!path.exists()) { path.mkdirs(); } else if (!path.isDirectory()) { throw new IllegalArgumentException("Path is not directory"); } } } 

    其他答案并不适用于kitkat及以上的sdcard(Environment.getExternalStorageDirectory()!= SDCARD)。 但您可以将此代码用于api 21及更高版本! 有关获取zipDocumentFile的更多帮助,请阅读:

     /** * @return true->successful */ public static Boolean unzip(Context context, DocumentFile zipDocumentFile) { try { InputStream inputStream = context.getContentResolver().openInputStream(zipDocumentFile.getUri()); assert inputStream != null; ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(inputStream, BUFFER_SIZE)); ZipEntry ze; while ((ze = zipInputStream.getNextEntry()) != null) { if (ze.isDirectory()) { String[] paths = ze.getName().split("/"); DocumentFile documentFile = null; for (String path : paths) { if (documentFile == null) { documentFile = zipDocumentFile.getParentFile().findFile(path); if (documentFile == null) documentFile = zipDocumentFile.getParentFile().createDirectory(path); } else { DocumentFile newDocumentFile = documentFile.findFile(path); if (newDocumentFile == null) { documentFile = documentFile.createDirectory(path); } else { documentFile = newDocumentFile; } } } if (documentFile == null || !documentFile.exists()) return false; } else { String[] paths = ze.getName().split("/"); //Make Folders DocumentFile documentFile = null; for (int i = 0; i < paths.length - 1; i++) { if (documentFile == null) { documentFile = zipDocumentFile.getParentFile().findFile(paths[i]); if (documentFile == null) documentFile = zipDocumentFile.getParentFile().createDirectory(paths[i]); } else { DocumentFile newDocumentFile = documentFile.findFile(paths[i]); if (newDocumentFile == null) { documentFile = documentFile.createDirectory(paths[i]); } else { documentFile = newDocumentFile; } } } DocumentFile unzipDocumentFile; if (documentFile == null) { unzipDocumentFile = zipDocumentFile.getParentFile().createFile(URLConnection.guessContentTypeFromName(ze.getName()), paths[paths.length - 1]); } else { unzipDocumentFile = documentFile.createFile(URLConnection.guessContentTypeFromName(ze.getName()), paths[paths.length - 1]); } // unzip the file OutputStream outputStream = context.getContentResolver().openOutputStream(unzipDocumentFile.getUri()); int read; byte[] data = new byte[BUFFER_SIZE]; assert outputStream != null; while ((read = zipInputStream.read(data, 0, BUFFER_SIZE)) != -1) outputStream.write(data, 0, read); zipInputStream.closeEntry(); } } return true; } catch (Exception e) { e.printStackTrace(); return false; } }