package org.bookdash.android.data.utils; import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class ZipManager { private static final String TAG = "ZipManager"; public void unzip(String _zipFile, String _targetLocation) { //create target location folder if not exist boolean directoryExtracted = directoryChecker("", _targetLocation); if (directoryExtracted) { Log.d(TAG, "Directory exists, not unzipping"); return; } try { File archive = new File(_zipFile); ZipFile zipfile = new ZipFile(archive); for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) { ZipEntry entry = (ZipEntry) e.nextElement(); unzipEntry(zipfile, entry, _targetLocation); } zipfile.close(); } catch (Exception e) { Log.e(TAG, "Exception:", e); } } private void createDir(File dir) { if (dir.exists()) { return; } Log.v(TAG, "Creating dir " + dir.getName()); if (!dir.mkdirs()) { throw new RuntimeException("Can not create dir " + dir); } } private void unzipEntry(ZipFile zipfile, ZipEntry entry, String outputDir) throws IOException { if (entry.isDirectory()) { createDir(new File(outputDir, entry.getName())); return; } File outputFile = new File(outputDir, entry.getName()); if (!outputFile.getParentFile().exists()) { createDir(outputFile.getParentFile()); } Log.v(TAG, "Extracting: " + entry); BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry)); BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); try { copy(inputStream, outputStream); } finally { outputStream.close(); inputStream.close(); } } private static final int BUF_SIZE = 0x1000; // 4K private static long copy(InputStream from, OutputStream to) throws IOException { byte[] buf = new byte[BUF_SIZE]; long total = 0; while (true) { int r = from.read(buf); if (r == -1) { break; } to.write(buf, 0, r); total += r; } return total; } private boolean directoryChecker(String location, String dir) { File f = new File(location, dir); if (f.exists()) { return true; } if (!f.isDirectory()) { f.mkdirs(); return false; } return false; } }