Esse tipo de código geralmente usado para fazer download de arquivos em aplicações web e que usam um buffer para escrever a saída sempre me causam uma dúvida. A dúvida é em relação ao uso da memória pela JVM, supomos que devemos fazer download de um arquivo jpg de tamanho relativamente grande, com o código abaixo, como esse buffer trabalha com a memória? a cada iteração do while essa quantidade de bytes já é lida e jogada para a saída e logo após essa quantidade de memória é liberada? ou apenas após de ler todos os bytes da imagem(carrega a quantidade total de bytes na memória?) e dar o outputStream.close ou o flush esses bytes vão para a saida e a memória é liberada?
public class DownloadFileServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String filePath = "C:/Test/Download/MYPIC.JPG";
File downloadFile = new File(filePath);
FileInputStream inStream = new FileInputStream(downloadFile);
String relativePath = getServletContext().getRealPath("");
ServletContext context = getServletContext();
String mimeType = context.getMimeType(filePath);
if (mimeType == null) {
mimeType = "application/octet-stream";
}
response.setContentType(mimeType);
response.setContentLength((int) downloadFile.length());
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
response.setHeader(headerKey, headerValue);
OutputStream outStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
inStream.close();
outStream.close();
}
}