2013-09-29 1 views
2

나는 base64로 인코딩 된 데이터를 파일에 기록하고, 즉시 디코드하려고합니다. 나는이 작품 생각이러한 래핑 된 Java I/O 개체를 몇 개 닫아야합니까?

BufferedWriter bw = new BufferedWriter(
    new OutputStreamWriter(
    new Base64OutputStream(
     new FileOutputStream(myFile, false))); 

을 가지고, 내 finally 블록에 나는 bw.close() 전화 - 즉, close the outermost wrapper입니다. 그것으로 충분합니까? 아니면 익명의 중간 객체가 누설 될 것입니까?

코드를 살펴 보았지만 Sun의 독점적 인 OutputStreamWriter 인코딩 핸들러 구현에 매달려있었습니다. 또한 문서에 명시 적으로 표시되어 있지 않습니다.

+3

다음 중 중복 : http://stackoverflow.com/questions/6586866/closing-nested-streams 및 : http://stackoverflow.com/questions/8080649/do-i-have-to-close-fileoutputstream- which-wrapped-by-printstream – sara

+0

왜 내가 그걸 찾을 수 없었는지 모르겠습니다. 감사합니다. – Coderer

답변

8

일반적으로 가장 바깥 쪽 래퍼를 닫으면 충분합니다. 각 래퍼는 닫혀있을 때 밑에있는 스트림을 닫습니다.

이 작업을 수행하지 않는 래퍼를 만들 수 있습니다,하지만 그 FilterOutputStream에 대한 설명서 이후 버그로 간주 될 수는 호출이 가장 좋은 방법은 가장 바깥 쪽 스트림을 닫는 것입니다 "releases any system resources associated with the stream."

+1

이 규칙을 어기는 JDK의 유일한 클래스는'#close()'를 호출하기 전에 별도의 엔트리를 닫을 것을 요구하는'ZipOutputStream'입니다. – Esko

3

을 종료해야합니다 목적. 올바르게 구현되었다고 가정하면이 객체는 랩핑 된 객체에 close()을 호출하고 클로즈는 체인을 따라 전파합니다. 올바른 일을합니다.

출력 파이프 라인의 경우 실제로는 중요입니다. 이렇게하면됩니다. 가장 안쪽의 출력 스트림/기록기 만 닫으면 버퍼링 된 출력 (파이프 라인의 어딘가)이 제대로 기록되지 않을 가능성이 있습니다.

2

BufferedWriter extends AutoClosable부터 Java 7에서 try-with-resources statement을 사용하면 리소스가 범위를 벗어 났을 때 리소스를 자동으로 닫을 수 있습니다.

try(BufferedWriter bw = new BufferedWriter(
    new OutputStreamWriter(
    new Base64OutputStream(
     new FileOutputStream(myFile, false))); 
    ) { 

     // bw.write(); 

} catch(XXXException ex) { 
    // Catch Block. 
} 

은 try-와-자원 문은 각 자원이 문

또한, 코드는 이런 식으로 청소기 모양의 끝에 닫혀 있는지 확인합니다.

+0

필자는 당분간은 Java 6를 지원해야합니다. 나는 분명히 오히려 이것을 할 것이다. – Coderer