Dựa trên giải pháp Sreedev R, tôi đã thêm các tùy chọn để đọc các tập tin từ tài sản và sử dụng đệm:
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());
}
}
}
}
Nguồn
2014-12-09 09:36:30
gì vấn đề u đang nhận được? nơi bạn muốn giải nén tệp zip bên trong bộ nhớ trong hoặc Bộ nhớ ngoài? –
Bạn biết rằng tài sản đang được công cụ Android nén, dù sao đi nữa. Vì vậy, bạn đang thực hiện nén kép bằng cách đặt một tệp zip vào đó. Nếu bạn muốn gộp các tệp lại với nhau, bạn có thể: sử dụng tar? làm nén của riêng bạn mà không nén? Nếu gói không phải là mục tiêu, chỉ cần đặt các tập tin thô và để nén cho chuỗi công cụ Android. – akauppi