문제

텍스트 파일에서 읽을 때 일반적으로 FileReader 그런 다음 이를 BufferedReader.읽기를 마친 후 두 리더 중 어느 리더를 닫아야 합니까?그게 그렇게 중요한 건가?

FileReader fr = null;
BufferedReader br = null;
try
{
    fr = new FileReader(fileName);
    br = new BufferedReader(fr);
    // ...
}
finally
{
    // should I close fr or br here?
}

나는 예외 안전에 관해서 약간 편집증적입니다.다음과 같은 경우에는 어떻게 됩니까? BufferedReader 생성자가 예외를 발생시킵니까?중첩된 리더를 닫나요?아니면 던지지 않는 것이 보장됩니까?

도움이 되었습니까?

해결책

일반적으로, close() 가장 바깥쪽 스트림 래퍼에서 호출합니다. close() 래핑된 스트림에서.그러나 생성자가 예외를 던질 가능성이 있다고 생각되면 다음을 자유롭게 사용하십시오. 닫을 수 있음 상호 작용.

FileReader fr = new FileReader(fileName);
Closeable res = fr;
try {
    BufferedReader br = new BufferedReader(fr);
    res = br;
} finally {
    res.close();
}

따라서 JVM에 버퍼용 힙 공간이 부족하고 오류가 발생하더라도 파일 핸들이 누출되지 않습니다.

Java 7 이상의 경우 try-with-resources를 사용하십시오.

try (FileReader fr = new FileReader(fileName);
    BufferedReader br = new BufferedReader(fr)) {
  // do work
}

다른 팁

BufferedReader 만 닫으면 FileReader를 래핑합니다. 소스 코드 의 소스 코드 BufferedReader 메서드가 래핑 된 스트림을 닫은 것을 확인하십시오.

마지막으로 BufferedReader를 닫으십시오.

BufferedReader의 Close 메소드를 호출하면 BufferedReader가 FileReader의 Close 메소드를 호출합니다.따라서 닫기 방법이 모두 호출됩니다.보다 정확하게 BufferedReader는 FileReader의 Close 메소드를 호출하는 을 제공하지만 을 수행하지 않습니다.따라서 그것은 전혀 중요하지 않습니다.나는 그것이 좋은 실무가 너무납니다.

아무것도 보장되지 않습니다.버퍼가 할당되므로 OutOfMemoryError를 던질 수 있습니다.나는 보통 내 코드를 2 개의 섹션으로 분리시킨 다음 자원을 획득 한 다음 자원을 사용합니다.각 섹션에는 일반적으로 고유 한 정리 요구 사항이 있습니다

여기를 설명하는 코드가 있습니다.

// Acquire resources section.

final FileReader fr = new FileReader( fileName );

BufferedReader br = null;

try
{
    br = new BufferedReader(fr);
}
finally
{
    if ( br == null )
    {
        // Note that you are closing the fr here
        fr.close( );
    }
}

// Use resources section
try
{
    // ... use br
}
finally
{
    // Now that br is safely constructed, just all its close
    br.close( );
}
.

와 나는 당신에게 동의하며, 장기 실행중인 서버 응용 프로그램에서 파일 핸들러를 자동으로 느슨하게 느슨하게 할 가치가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top