mi aplicación descarga un archivo zip con aproximadamente 350 archivos. Una mezcla de archivos JPG y HTML. La función que escribí para hacerlo funciona bien, pero la descompresión tarda para siempre. Al principio pensé que la razón podría ser que escribir en la tarjeta SD es lento. pero cuando descomprimo el mismo archivo comprimido con otra aplicación en mi teléfono, funciona mucho más rápido. ¿Hay algo que pueda hacer para optimizarlo?Extrakting Zip to SD-Card es muy lento. ¿Cómo puedo optimizar el rendimiento?
Aquí está el código:
private void extract() {
try {
FileInputStream inStream = new FileInputStream(targetFilePath);
ZipInputStream zipStream = new ZipInputStream(new BufferedInputStream(inStream));
ZipEntry entry;
ZipFile zip = new ZipFile(targetFilePath);
//i know the contents for the zip so i create the dirs i need in advance
new File(targetFolder).mkdirs();
new File(targetFolder + "META-INF").mkdir();
new File(targetFolder + "content").mkdir();
int extracted = 0;
while((entry = zipStream.getNextEntry()) != null) {
if (entry.isDirectory()) {
new File(targetFolder + entry.getName()).mkdirs();
} else {
FileOutputStream outStream = new FileOutputStream(targetFolder + entry.getName());
for (int c = zipStream.read(); c != -1; c = zipStream.read()) {
outStream.write(c);
}
zipStream.closeEntry();
outStream.close();
extracted ++;
}
publishProgress(""+(int)extracted*100/zip.size());
}
zipStream.close();
inStream.close();
//
new File(targetFilePath).delete();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
gracias a CommonsWare he modificado mi código como este:
int size;
byte[] buffer = new byte[2048];
FileOutputStream outStream = new FileOutputStream(targetFolder + entry.getName());
BufferedOutputStream bufferOut = new BufferedOutputStream(outStream, buffer.length);
while((size = zipStream.read(buffer, 0, buffer.length)) != -1) {
bufferOut.write(buffer, 0, size);
}
bufferOut.flush();
bufferOut.close();
gran diferencia de rendimiento. Muchas gracias.
GRACIAS! Eso realmente hizo el truco. – notme
El enlace proporcionado en esta respuesta no funciona. –
@CommonsWare El enlace está caído, ¿podría corregirlo? – Scorchio