Android: ¿Una forma más rápida de leer / escribir un ZipInputStream?

Actualmente estoy escribiendo una aplicación que lee un archivo zip en mi carpeta de activos que contiene un montón de imágenes. Estoy utilizando la API ZipInputStream para leer el contenido y luego escribir cada archivo en mi directorio: Environment.getExternalStorageDirectory() . Tengo todo trabajando, pero la primera vez que la aplicación se ejecuta escribiendo las imágenes en el directorio de almacenamiento es INCREDIBLE lento. Se tarda unos 5 minutos para escribir mis imágenes en el disco. Mi código se ve así:

 ZipEntry ze = null; ZipInputStream zin = new ZipInputStream(getAssets().open("myFile.zip")); String location = getExternalStorageDirectory().getAbsolutePath() + "/test/images/"; //Loop through the zip file while ((ze = zin.getNextEntry()) != null) { File f = new File(location + ze.getName()); //Doesn't exist? Create to avoid FileNotFoundException if(f.exists()) { f.createNewFile(); } FileOutputStream fout = new FileOutputStream(f); //Read contents and then write to file for (c = zin.read(); c != -1; c = zin.read()) { fout.write(c); } } fout.close(); zin.close(); 

El proceso de leer el contenido de la entrada en particular y luego escribirle es MUY lento. Estoy asumiendo que tiene más que ver con la lectura que con la escritura. He leído que usted puede utilizar un buffer de matriz de byte[] para acelerar el proceso, pero esto no parece funcionar! He intentado esto, pero sólo leer parte del archivo …

  FileOutputStream fout = new FileOutputStream(f); byte[] buffer = new byte[(int)ze.getSize()]; //Read contents and then write to file for (c = zin.read(buffer); c != -1; c = zin.read(buffer)) { fout.write(c); } } 

Cuando lo hago sólo obtengo unos 600-800 bytes escritos. ¿Hay una manera de acelerar esto? ¿He implementado la matriz de búfer incorrectamente?

    He encontrado una solución mucho mejor que implementa la API BuffererdOutputStream . Mi solución se ve así:

      byte[] buffer = new byte[2048]; FileOutputStream fout = new FileOutputStream(f); BufferedOutputStream bos = new BufferedOutputStream(fout, buffer.length); int c = 0; int size; while ((size = zin.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, size); } //Close up shop.. bos.flush(); bos.close(); fout.flush(); fout.close(); zin.closeEntry(); 

    Me las arreglé para aumentar mi tiempo de carga desde cualquier lugar de un promedio de unos 5 minutos a unos 5 (dependiendo de cuántas imágenes están en el paquete). ¡Espero que esto ayude!

    Intente usar http://commons.apache.org/io/ como:

      InputStream in = new URL( "http://jakarta.apache.org" ).openStream(); try { System.out.println( IOUtils.toString( in ) ); } finally { IOUtils.closeQuietly(in); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.