2016-07-17 4 views
1

this answer에서 남자는 IOUtils.copy을 사용하여 제안했지만 그는 OutputStream을 닫지 않았습니다.IOUtils : OutputStream을 닫아야합니까?

InputStream is = new URL(imgUrl).openStream(); 
OutputStream os = servletResponse.getOutputStream(); 

IOUtils.copy(is, os); 
is.close(); 

내가 IOUtils에서 copy 방법에 대한의 javadoc를 확인하고 내가 그 샘플에서의 OutputStream 종료 할 필요가 궁금 있도록 OutputStream에가보기 자동 폐쇄됩니다 정보가없는 : 여기에 자신의 예제?

+0

자원 또는 증기를 닫으려면 'finally'블록에서 'close()'를 호출하여 항상 실행되도록하십시오. 또는 [try-with-resources 문] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)에서 리소스를여십시오. – matsev

답변

2

IOUtils.copy(InputStream, OutputStream)OutputStream을 닫지 않아야합니다. 예를 들어 다른 InputStreams을 연결하는 데이 메서드를 사용할 수 있습니다.이 경우 제공된 Input- 및/또는 OutputStream을 닫는 것이 좋지 않습니다.

일반적으로 모든 방법은 열리는 증기 만 닫아야합니다. 도 참조 Should I close the servlet outputstream?

1

여러분이 말한 것처럼 the documentationOutputStream을 닫는 데 아무런 내용이 없으므로 명시 적으로 또는 자원을 사용하여 try-with-resources를 사용하여 닫아야합니다.

그 이유는 Tomasz이 응답에서 스트림을 닫지 않았기 때문에 서블릿 응답의 출력 스트림이라는 것입니다. andih이 (가) a comment에서 말한대로라면 개를 열면이됩니다. 서블릿 컨테이너는 서블릿 응답 스트림을 관리합니다.

+1

**의 OutputStream을 닫지 마십시오. ServletResponse. 열어 본 스트림 만 닫아야합니다. 또한 : http://stackoverflow.com/questions/1829784/should-i-close-the-servlet-outputstream – andih

+0

사실, 소스 코드 *를 보면 IOUtils.copy가 스트림을 닫지 않는다는 것을 확인할 수 있습니다. . –