Simplemente tenía que hacer exactamente lo mismo ayer.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(baos);
.... populate ZipOutputStream
String filename = "out.zip";
// the response variable is just a standard HttpServletResponse
response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");
response.setContentType("application/zip");
try{
response.getOutputStream().write(baos.toByteArray());
response.flushBuffer();
}
catch (IOException e){
e.printStackTrace();
}
finally{
baos.close();
}
Nota que estoy usando un envoltorio ByteArrayOutputStream y toByteArray pero probablemente podría simplemente escribir cualquier otro tipo de flujoSalida directamente a la respuesta con un bucle estándar InputStream.read() OutputStream.write().
No estoy seguro de cuál es el más rápido, pero sospecho que el uso de ByteArrayOutputStream aquí podría no ser el enfoque más consciente de la memoria: