Quando trabalhamos com frameworks we como o Spring ou JSF e temos que realizar o download de arquivos geralmente encontramos códigos como :
@RequestMapping(path = "/download", method = RequestMethod.GET)
public ResponseEntity<Resource> download(String param) throws IOException {
// ...
InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
return ResponseEntity.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(resource);
}
ou
public void download() throws IOException {
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
response.reset();
response.setContentType(contentType);
response.setContentLength(contentLength);
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
OutputStream output = response.getOutputStream();
fc.responseComplete(); //
Neses casos o programador precisar fechar o output stream e dar o flush manualmente ou no caso o Spring e o JSF sabem como fechar e dar o flush automaticamente? após a execução dos métodos a variaél que contem os bytes já ficam elegívis para o GC?