Cómo leer el contenido del archivo comprimido sin extraerlo en java

Tengo archivo con nombres como ex.zip . En este ejemplo, el archivo Zip contiene solo un archivo con el mismo nombre (es decir, `ex.txt ‘), que es bastante grande. No quiero extraer el archivo zip cada vez. Por lo tanto, necesito leer el contenido del archivo (ex.txt) sin extraer el archivo zip. Probé un código como el siguiente, pero solo puedo leer el nombre del archivo en la variable.

¿Cómo leo el contenido del archivo y lo almacena en la variable?

Gracias de antemano

 fis=new FileInputStream("C:/Documents and Settings/satheesh/Desktop/ex.zip"); ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); ZipEntry entry; while((entry = zis.getNextEntry()) != null) { i=i+1; System.out.println(entry); System.out.println(i); //read from zis until available } 

Prueba esto:

  ZipFile fis = new ZipFile("ex.zip"); int i = 0; for (Enumeration e = zip.entries(); e.hasMoreElements();) { ZipEntry entry = (ZipEntry) e.nextElement(); System.out.println(entry); System.out.println(i); InputStream in = fis.getInputStream(entry); } 

Por ejemplo, si el archivo contiene texto y desea imprimirlo como una cadena, puede leer el InputStream así: Leer / convertir un InputStream en una cadena

Su idea es leer el archivo zip como está en una matriz de bytes y almacenarlo en una variable. Más tarde, cuando necesites el zip, lo extraes a pedido, guardando la memoria:

Primero lea el contenido del archivo Zip en una matriz de bytes zipFileBytes

Si tiene Java 1.7:

 Path path = Paths.get("path/to/file"); byte[] zipFileBytes= Files.readAllBytes(path); 

de lo contrario use Appache.commons lib

 byte[] zipFileBytes; zipFileBytes = IOUtils.toByteArray(InputStream input); 

Ahora su archivo Zip se almacena en una variable zipFileBytes, todavía en forma comprimida.

Luego, cuando necesites extraer algo, utiliza

 ByteArrayInputStream bis = new ByteArrayInputStream(zipFileBytes)); ZipInputStream zis = new ZipInputStream(bis); 

Creo que en su caso, el hecho de que un archivo zip sea un contenedor que puede contener muchos archivos (y por lo tanto lo obliga a navegar al archivo contenido correcto cada vez que lo abre) complica las cosas, ya que afirma que cada archivo zip solo contiene uno Archivo de texto. Tal vez sea mucho más fácil simplemente gzip el archivo de texto (gzip no es un contenedor, solo una versión comprimida de sus datos). Y es muy simple de usar:

 GZIPInputStream gis = new GZIPInputStream(new FileInputStream("file.txt.gz")); // and a BufferedReader on top to comfortably read the file BufferedReader in = new BufferedReader(new InputStreamReader(gis) ); 

Producirlos es igualmente simple:

 GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream("file.txt.gz")); 
    Intereting Posts