2009-11-12 10 views
26

Tengo una clase que envuelve ZipEntrys, pero estoy luchando para ver cómo podría escribir un método que devuelva un flujo de entrada desde cualquier ZipEntry. Me las arreglé para escribir algo que podría devolver una serie de flujos de entrada para un archivo ZipFile, pero necesito una manera de obtener un flujo de entrada de una sola ZipEntry.Cómo creo un flujo de entrada desde un ZipEntry

+3

Mira: http://stackoverflow.com/questions/3233555/is-it-possible-to-get-a-zipentrys-inputstream-from-a-zipinputstream – diyism

Respuesta

20

¿No tiene la instancia ZipFile de la que se originó ZipEntry? Si lo hace, podría usar ZipFile.getInputStream (ZipEntry).

https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipFile.html

PS. Solo eché un rápido vistazo al código y ZipEntry no es un contenedor para los datos subyacentes en el archivo zip. Es solo un "marcador de posición" para la entrada hasta donde puedo ver (es decir, los atributos del archivo comprimido no los datos). La transmisión real se crea a través de una llamada JNI en la clase ZipFile. Lo que significa que no creo que puedas hacer lo que estás buscando hacer de una manera práctica.

+0

Malcolm, Gracias por la ayuda, Acabo de encontrar ese método. Mi problema ahora es que el código que originalmente 'abre' el archivo zip (cuando lo hace ZipFile zip = new ZipFile ("ruta");), luego lo cierra. Puedo detenerlo cerrándolo si quiero, pero me preguntaba: ¿cuáles son las consecuencias de no cerrar cremalleras/frascos? Obviamente, si elimino el comando close() dejaré un método para que el usuario pueda cerrarlo más tarde, pero me preguntaba qué pasaría si el usuario lo olvidara: ¿solo codicioso para la memoria? Sé que no es un envoltorio para los datos; lo que estoy escribiendo es un envoltorio para tratar con archivos Zip/Jar. – Stephen

+1

Dejarlo abierto no me parece una buena idea. Igualmente, para aplazar la responsabilidad de cerrar al usuario de su solución. Una opción (posiblemente, estoy adivinando el problema que está resolviendo) es envolver ZipEntry e incluir un identificador para ZipFile en la clase de envoltura. Esto parece un poco pesado, pero significa que puede abrir \ cerrar una secuencia a la entrada zip envuelto cuando lo necesite. –

27

¿Qué tal esto?

ZipFile zipFile = new ZipFile("file.zip"); 
ZipEntry zipEntry = zipFile.getEntry("fileName.txt");  
InputStream inputStream = zipFile.getInputStream(zipEntry); 
+0

+1 para el fragmento de código. –

+1

Desafortunadamente, la creación de una nueva instancia de ZipFile filtra identificadores de archivo en 1.4.2_12 –

4
static void printInputStream(File zip) throws IOException 
    { 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(zip)); 
     for (ZipEntry zipEntry;(zipEntry = zin.getNextEntry()) != null;) 
     { 
      System.out.println("reading zipEntry " + zipEntry.getName()); 
      Scanner sc = new Scanner(zin); 
      while (sc.hasNextLine()) 
      { 
       System.out.println(sc.nextLine()); 
      } 
      System.out.println("reading " + zipEntry.getName() + " completed"); 
     } 
     zin.close(); 
    } 

Se encontró aquí:
getInputStream for a ZipEntry from ZipInputStream (without using the ZipFile class)

malentendido en lo que es el flujo de entrada que se abre desde el archivo zip. Solución: abrir flujo de entrada desde el archivo zip ZipInputStream zipInputStream = ZipInputStream(new FileInputStream(zipfile), ciclo de ejecución zipInputStream.getNextEntry(). Para cada ronda, tiene la ruta de entrada para la entrada actual (abierta antes para el archivo zip); ..

Cuestiones relacionadas