티스토리 뷰

원문 : 


 

1. byte[] buf=new byte[8192]; (보통은 1024 같은걸로 해도 되고..) 식으로 코딩적으로 read buffer 를 구성하여 한번에 몽땅 읽어들여 메모리상에 올리지 않도록 함.

 

2. 파일이 클경우는 while 루프 를 모두 돌아 한방에 flush() 을 했다가는 여차하면 OutOfMemory 적절하게 중간에 flush()를 해서 write 버퍼를 비우는 작업을 곁들여 줌.(파일이 작을 경우는 이거 없어도 무방한데, 수백메가 짜리라면 필수적인듯...)

 

3. 추가적으로 파일이 클 경우 흔히 사용하는 BufferedInputStream 보다 FileInputStream 을 사용하는게 메모리 사용상 잇점이 있다는... (경험상 큰 차이는 못 느꼈는데, 위 글 작성자는 먼저 시도 해 보라함)

 

아래를 참고로 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();

 

 

참고로, struts2 의 파일다운로드 시 Result Type으로 Stream Result 를 세팅하면 편하게 다운로드를 설정할 수 도 있긴 한데,

  <result type="stream">

<param name="contentType">${contentType}</param>

<param name="inputName">inputStream</param>

<param name="contentLength">${contentLength}</param>

<param name="contentDisposition">${contentDisposition}</param>

<param name="bufferSize">4096</param>

</result>

 

코드를 찾아보니 이 Stream Result 는 마지막에 몰아서 flush() 하도록 구현된 듯... 

 // org.apache.struts2.dispatcher.StreamResult.java 

 

     byte[] oBuff = new byte[bufferSize];

     int iSize;

     while (-1 != (iSize = inputStream.read(oBuff))) {

          oOutput.write(oBuff, 0, iSize);

     }

     if (LOG.isDebugEnabled()) {

        LOG.debug("Streaming to output buffer +++ END +++");

     }

            

     // Flush

     oOutput.flush();

 

 

alvatros :)

 

 


댓글
공지사항
최근에 올라온 글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함