2009-09-07 4 views
152

은 내가 FileReader를 감싸 BufferedReader로 사용하여 로컬 파일을 읽고 있어요 :FileReader와 BufferedReader를 close()해야합니까?

BufferedReader reader = new BufferedReader(new FileReader(fileName)); 
// read the file 
// (error handling snipped) 
reader.close(); 

내가뿐만 아니라 FileReaderclose()해야합니까를, 또는 래퍼는 처리 할 것인가? 사람들이 같은 것을 할 어디 코드를 본 적이 :이 메소드는 서블릿에서 호출

FileReader fReader = new FileReader(fileName); 
BufferedReader bReader = new BufferedReader(fReader); 
// read the file 
// (error handling snipped) 
bReader.close(); 
fReader.close(); 

, 그리고 내가 열린 모든 핸들을 두지 않도록하고 싶습니다.

+4

예, 정보 소스를 읽을 수 있습니다. JDK 설치 디렉토리의 src.zip에 모두 있습니다. 예를 들어 http://www.docjar.com/html/api/java/io/BufferedReader.java.html에서 온라인으로 읽을 수 있습니다. – gustafc

+36

누군가에게 읽을 것을 이야기합니다. 근원은 "RTFM!"를 말하기보다는 나쁘다. 소스에 버그가 있으면 어떻게 될까요? 암시 적으로 우리는 * 올바른 * 행동이 무엇인지 알고 싶습니까? – Raedwald

+1

음 ...이 시점에서 : API 사양을 가리키는 것이 더 나아지지 않습니다. 소스가 문서에서 지정된 것처럼 작동하지 않는 버그가없는 경우 문서를 신뢰할 수 없습니다. 그런 질문에 대답하는 좋은 방법이 없습니다. – Atmocreations

답변

179

no.

BufferedReader.close() 

BufferedReaderInputStreamReader

뿐만 아니라

FileReader.close() 

수행을위한 자바 독에 따른 스트림을 닫는다.

+7

+1은 간결하고 명료합니다. – CPerkins

+11

'BufferedReader'에 대한 생성자가 예외를 throw하지 않는 한. 기본 스트림을 닫는 것만으로도 더 깨끗합니다. 다른 리소스와 버퍼링을 가진 데코레이터를주의해야합니다. –

+6

Javadoc는'BufferedReader.close()'가 기본이되는 리더를 닫는지의 여부를 표시하지 않습니다. 그 설명은 단순히'Reader.close()'에서 복사됩니다. 실제로는 실제 동작 일 수 있지만 문서화되지 않았습니다. –

6

BufferedReader 소스에 따르면이 경우 bReader.close는 기술적으로 fReader.close를 호출하므로 후자를 호출 할 필요가 없습니다.

4

BufferedReader의 소스 코드는 BufferedReader를 닫을 때 내부가 닫힌다는 것을 보여줍니다.

+0

저는 이것을 콘크리트에 링크하기위한 엄지 손가락을 정말로주고 싶습니다. 그러나 이것은 OpenJDK 구현을 가리키며 JavaDocs는'Reader # close()'에 대해 명확하지 않기 때문에 Oracle JDK 예를 들어, 유사한 방식으로 구현됩니다. – searchengine27

83

다른 사람들도 지적했듯이 외부 래퍼 만 닫으면됩니다.

BufferedReader reader = new BufferedReader(new FileReader(fileName)); 

BufferedReader 생성자 (예를 들어 OutOfMemoryError)에서 예외가 발생했습니다 경우이 파일 핸들을 누출 할 수있는 매우 슬림 기회가있다. 응용 프로그램이이 상태에있는 경우, 정리가 필요한 이유는 OS에서 다른 프로그램에 할당하려는 자원을 박탈하지 않는 것이 얼마나 중요한지에 달려 있습니다.

try (Reader reader = new FileReader(fileName); 
    BufferedReader buffered = new BufferedReader(reader)) { 
    // TODO: input 
} 
:

Reader reader = new FileReader(fileName); 
Closeable resource = reader; 
try { 
    BufferedReader buffered = new BufferedReader(reader); 
    resource = buffered; 
    // TODO: input 
} finally { 
    resource.close(); 
} 

자바 7 코드가 시도 -과 - 자원 패턴을 사용한다 :

Closeable 인터페이스는 래퍼 생성자는 자바 5 또는 6에 실패 할 경우에 사용할 수 있습니다

+3

감사합니다. 그것은 매우 계몽적이었습니다. – Zilk

+0

동일한 맥락에서 : http://stackoverflow.com/a/2732760/281545 –

0

당신은 단지 bufferedReader 즉 reader.close()를 닫아야 만 정상적으로 작동합니다. 객체가 리더 클래스의 추상 근접() 메서드를 호출 할 의 BufferedReader의 close() 메소드

FileReader fReader = new FileReader(fileName); 
BufferedReader bReader = new BufferedReader(fReader); 

궁극적 것 :

3

소스 코드를 확인한 후, 그 예 찾을 InputStreamReader 클래스의 구현 된 메서드를 호출 한 다음 InputStream 개체를 닫습니다.

따라서 bReader.close() 만 있으면 충분합니다.

+1

소스 코드가 보여주는 것은 참조 용입니다. 이것은 사양 *이 말하듯이 Javadoc에 의존 할 수 있습니다. – EJP