[java] FileReader와 BufferedReader를 모두 닫아야합니까?

FileReader를 감싸는 BufferedReader를 사용하여 로컬 파일을 읽고 있습니다.

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

수행 내가 필요 뿐만 아니라, 또는 랩퍼 핸들이? 사람들이 다음과 같은 작업을 수행하는 코드를 보았습니다.close()FileReader

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

이 메소드는 서블릿에서 호출되며 핸들을 열어 두지 않도록하고 싶습니다.



답변

아니.

BufferedReader.close()

BufferedReaderInputStreamReader에 대한 javadoc에 따라 스트림을 닫습니다.

만큼 잘

FileReader.close()

그렇습니다.


답변

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

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

BufferedReader생성자가 예외를 던지면 파일 핸들이 누출 될 가능성이 매우 적습니다 (예 🙂 OutOfMemoryError. 앱이이 상태 인 경우 다른 프로그램에 할당하려는 리소스의 OS를 박탈하지 않는 것이 얼마나 중요한지에 따라 정리가 얼마나주의를 기울여야하는지가 중요합니다.

닫기 가능한 래퍼 생성자는 자바 5 또는 6에 실패 할 경우 인터페이스를 사용할 수 있습니다 :

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

Java 7 코드는 try-with-resources 패턴을 사용해야합니다 .

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


답변

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


답변

BufferedReader 의 소스 코드는 BufferedReader를 닫을 때 기본이 닫 혔음을 보여줍니다.


답변

소스 코드를 확인한 후 예제에서 다음을 발견했습니다.

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

의 close () 메소드 의 BufferedReader 객체의 추상 근접 () 메서드를 호출 할 리더 궁극적에서 구현 된 메서드를 호출 할 클래스 InputStreamReader의 다음 닫 클래스 의 InputStream 객체를.

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


답변

Java 7부터는 try-with-resources 문을 사용할 수 있습니다

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

때문에 BufferedReader인스턴스가 시도 -과 – 자원 문에 선언, 그것은 상관없이 try 문이 정상적으로 갑자기 완료 여부에 종료됩니다. 따라서 finally성명서 에서 직접 닫을 필요는 없습니다 . (이것은 또한 중첩 된 자원 설명의 경우입니다)

리소스를 다룰 때 권장되는 방법 입니다. 자세한 내용은 설명서 를 참조하십시오.


답변

bufferedReader, 즉 reader.close () 만 닫으면 정상적으로 작동합니다.