Lee un archivo dentro de un archivo Zip y coloca su contenido en una cadena en Android

Esta es mi primera pregunta, aunque ya he usado muchos consejos de Stack Overflow. Pero para esta situación todavía no he encontrado una solución.

Aquí está la situación: tengo un archivo comprimido y quiero leer un archivo específico y poner su contenido en una variable de String, que se devolverá y se colocará en un TextView en Android. No quiero que el archivo se escriba en sdcard, solo quiero realizar una operación de memoria.

Por ejemplo, dentro de db.zip tengo un archivo llamado packed.txt, cuyo contenido es “Stack á é ç”. La cadena devuelta en mi método muestra “83 116 97 99 107 32 195 161 32 (…)”, que son los valores UTF-8 para los caracteres. Traté de convertirlos a una forma legible por humanos, pero no tuve éxito. Intenté InputStreamReader pero no pude hacer un uso correcto de él. Mi código fuente está abajo.

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import android.util.Log; /** * * @author jon */ public class Decompress { private String _zipFile; private String _location; public Decompress(String zipFile, String location) { _zipFile = zipFile; _location = location; _dirChecker(""); } public String unzip(String desiredFile) { String strUnzipped = ""; 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()); /**** Changes made below ****/ if (ze.getName().toString().equals(desiredFile)) { byte[] bytes = new byte[(int) ze.getSize()]; if (zin.read(bytes, 0, bytes.length) == bytes.length) { strUnzipped = new String(bytes, "UTF-8"); } else { strUnzipped = "Read error..."; } /*** REMOVED if (ze.getName() == desiredFile) { for (int c = zin.read(); c != -1; c = zin.read()) { strUnzipped += c; //fout.write(c); } */ } zin.closeEntry(); //fout.close(); } } zin.close(); } catch(Exception e) { Log.e("Decompress", "unzip", e); } return strUnzipped; } private void _dirChecker(String dir) { File f = new File(_location + dir); if(!f.isDirectory()) { f.mkdirs(); } } } 

Perdón por mi publicación inicial de este … revisé tu párrafo indicando que lo habías intentado.

Puede crear el InputStreamReader con un conjunto de caracteres de “UTF-8” que convertirá automáticamente los datos de entrada en los caracteres correctos para usted.

 while ((ze = zin.getNextEntry()) != null) { Log.v("Decompress", "Unzipping " + ze.getName()); if(ze.isDirectory()) { _dirChecker(ze.getName()); } else { if (ze.getName() == desiredFile) { byte[] bytes= new byte[ze.getSize()]; zin.read(bytes, 0, bytes.length); strUnzipped= new String( bytes, "UTF-8" ); /* Removing this as it is easier to just read all the bytes in at once InputStreamReader isr= new InputStreamReader(zin, "UTF-8"); char c= 0; for (char c = isr.read(); c != -1; c = isr.read()) { strUnzipped += c; } */ } zin.closeEntry(); } } 

Por favor, intente lo anterior y vea cómo funciona.

¿Por qué no cargarlos en una matriz de bytes y usar una nueva cadena (byte []) o usar el StringBuilder?

 StringBuilder sb = new StringBuilder(); for (int c = zin.read(); c != -1; c = zin.read()) { sb.append((byte)c); } ... return sb.toString();