Anteriormente teníamos algunos archivos zip dentro de nuestra aplicación web. Quisiéramos emparejar un documento de texto específico dentro del archivo zip. Esto no fue un problema:Leyendo un archivo zip dentro de un archivo jar
URL url = getClass().getResource(zipfile);
ZipFile zip = new ZipFile(url.getFile().replaceAll("%20", " "));
Entry entry = zip.getEntry("file.txt");
InputStream is = zip.getInputStream(entry);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = reader.readLine();
while (line != null) {
// do stuff
}
Sin embargo, hemos movido estos archivos zip a otro módulo y queremos empaquetarlos dentro de un contenedor. Desafortunadamente, la creación del ZipFile
ahora falla. Puedo obtener un InputStream
para el zip: pero no tengo forma de obtener un flujo de entrada para la entrada en sí.
InputStream is = getClass().getResourceAsStream(zipfile);
ZipInputStream zis = new ZipInputStream(is);
ZipEntry entry = zis.getNextEntry();
while (entry != null && !entry.getName().equals("file.txt")) {
entry = zis.getNextEntry();
}
pero no tengo forma de obtener un flujo de entrada para la entrada en sí. Traté de encontrar la longitud de la entrada y obtener los siguientes n bytes desde el ZipInputStream
pero esto no funcionó para mí. Parecía que todos los bytes leídos eran 0.
¿Hay alguna forma de evitar esto o voy a tener que mover los archivos zip de vuelta al proyecto central?
De hecho, puede utilizar Class.getResourceAsStream y ZipInputStream para leer el exterior -zip también. De esta forma, no necesita reemplazar el nombre de archivo ad-hoc y no confíe en la URL para acceder a los archivos. – helios