java - crear - ¿Es posible obtener la entrada de un zipentry desde un zipinputstream?
crear zip java (3)
Además de @pstanton post aquí hay un ejemplo de código. Resolví el problema usando el siguiente código. Fue difícil entender cuál fue la respuesta anterior sin un ejemplo.
//If you just want the first file in the zipped InputStream use this code.
//Otherwise loop through the InputStream using getNextEntry()
//till you find the file you want.
private InputStream convertToInputStream(InputStream stream) throws IOException {
ZipInputStream zis = new ZipInputStream(stream);
zis.getNextEntry();
return zis;
}
Usando este código puede devolver un InputStream del archivo comprimido.
Estoy recibiendo un ZipInputStream de otra fuente y necesito proporcionar el InputStream de la primera entrada a otra fuente.
Esperaba poder hacer esto sin guardar un archivo temporal en un dispositivo, sin embargo, la única manera que conozco de obtener un InputStream para una entrada individual es a través de ZipFile.getInputStream (entrada) y ya que tengo un ZipInputStream y no un ZipFile , Eso no es posible.
Así que la mejor solución que tengo es
- guardar InputStream entrante en un archivo
- leer el archivo como ZipFile
- usa el InputStream de la primera entrada
- eliminar el archivo temporal.
El código postal es bastante fácil, pero tuve problemas al devolver ZipInputStream como Inputstream. Por alguna razón, algunos de los archivos contenidos en el zip tenían caracteres que se estaban eliminando. La siguiente fue mi solución y hasta ahora ha estado funcionando.
private Map<String, InputStream> getFilesFromZip(final DataHandler dhZ,
String operation) throws ServiceFault {
Map<String, InputStream> fileEntries = new HashMap<String, InputStream>();
try {
ZipInputStream zipIsZ = new ZipInputStream(dhZ.getDataSource()
.getInputStream());
try {
ZipEntry entry;
while ((entry = zipIsZ.getNextEntry()) != null) {
if (!entry.isDirectory()) {
Path p = Paths.get(entry.toString());
fileEntries.put(p.getFileName().toString(),
convertZipInputStreamToInputStream(zipIsZ));
}
}
}
finally {
zipIsZ.close();
}
} catch (final Exception e) {
faultLocal(LOGGER, e, operation);
}
return fileEntries;
}
private InputStream convertZipInputStreamToInputStream(
final ZipInputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
InputStream is = new ByteArrayInputStream(out.toByteArray());
return is;
}
figurado:
es totalmente posible, la llamada a ZipInputStream.getNextEntry () coloca InputStream al inicio de la entrada y, por lo tanto, suministrar ZipInputStream es el equivalente a suministrar InputStream de ZipEntry.
ZipInputStream es lo suficientemente inteligente como para manejar el EOF de la entrada en sentido descendente, o eso parece.
pag.