Download outOfMemory
JAVA 에서 파일 다운로드 구현 시 파일사이즈가 작은 경우는 아무렇게나 코딩을 해도 쉽사리 에러가 나지 않습니다. 하지만 큰 파일을 다운로드 하는 서블릿이나 Action 을 구현할 경우 종종 OutOfMemory 가 발생 할 수 있습니다.
byte[] buffer 를 이용하는 것은 널리 알려져 있지만, 그래도 종종 문제가 되는 상황을 보게 되는데, StackOverFlow에 좋은 답변이 나와있어서 개인적으로 정리를 해보기 위해 작성합니다.
원문
http://stackoverflow.com/questions/7106775/how-to-download-large-files-without-memory-issues-in-java
1. byte[] buf = new byte[8192];
(보통은 1024로 해도 됩니다. ) 식으로 코딩적으로 read buffer 를 구성하면 한번에 읽어들여 메모리상에 올리지 않도록 함.
2. 파일이 클경우는 while 루프를 모두 돌아 한방에 flush() 을 했다가는 여차하면 OutOfMemory 가 발생하므로 적절하게 중간에 flush()를 해서 write 버퍼를 비우는 작업을 해줍시다. (파일이 작을경우는 상관없지만, 파일이 크게되면 필수적으로 해주는게 좋을꺼같습니다.)
3. 추가적으로 파일이 클 경우 흔히들 사용하는 BufferedInputStream 보다 FileInputStream 을 사용하는게 메모리 사용상 좋다고 합니다. (제 의견보다는 원문에 작성자분께서 우선적으로 사용해보면 좋다고..)
ex) Servlet 이든 jsp 이든 적절히 둘러싸면 될꺼 같습니다.
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buf = new byte[8192];
int bytesread = 0, bytesBuffered = 0;
while( (bytesread = fileInputStream.read( buf )) > -1 ) {
out.write (buf, 0, bytesread);
bytesBuffered += bytesread;
if (bytesBuffered > 1024 * 1024) { //flush after 1MB
bytesBuffered = 0;
out.flush();
}
}
out.flush();
'JAVA' 카테고리의 다른 글
[JAVA] error (0) | 2017.11.06 |
---|---|
[JAVA]EncodingFilter 구현 (0) | 2017.11.06 |
[JAVA]Dispatche :: request.getRequestDispatcher("/prg/board_excel.jsp"); (0) | 2017.11.03 |
[JAVA]dbconnection 끊어지는 현상 (0) | 2017.11.03 |
[JAVA] DateUtil2 (0) | 2017.11.01 |