programing

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

firstcheck 2022. 10. 30. 22:22
반응형

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가 다른 프로그램에 할당하려는 리소스를 빼앗지 않는 것이 얼마나 중요한지에 따라 달라질 수 있습니다.

Java 5 또는 6에서 래퍼 컨스트럭터가 실패할 가능성이 높은 경우 Closeable 인터페이스를 사용할 수 있습니다.

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

Java 7 코드는 리소스 사용 패턴을 사용해야 합니다.

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

BufferedReader의 소스 코드는 BufferedReader를 닫으면 기반이 닫히는 것을 나타냅니다.

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

소스코드를 확인해 본 결과, 예를 들면 다음과 같습니다.

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

BufferedReader 객체의 close() 메서드는 Reader 클래스의 abstract close() 메서드를 호출합니다.이 메서드는 최종적으로 InputStreamReader 클래스의 구현 메서드를 호출하여 InputStream 객체를 닫습니다.

따라서 bReader.close()만 있으면 됩니다.

Java 7부터는 리소스 사용 설명문을 사용할 수 있습니다.

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

냐하 because는BufferedReader 갑자기 완료되었는지 여부에 .try-with-resource try는 try-resource로 실행됩니다. 때문에 닫지 됩니다.finally네스트된 자원

이는 리소스 작업을 위해 권장되는 방법입니다. 자세한 내용은 설명서를 참조하십시오.

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

늦었지만:

BufferReader.java:

public BufferedReader(Reader in) {
  this(in, defaultCharBufferSize);
}

(...)

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        try {
            in.close();
        } finally {
            in = null;
            cb = null;
        }
    }
}

래핑된 리더/라이터를 닫을 필요가 없습니다.

문서()Reader.close()Writer.close()를 확인하신 경우 에서 확인하실 수 있습니다.Reader.close()다음과 같이 되어 있습니다.

스트림을 닫고 관련된 시스템리소스를 해방합니다.

즉, "관련된 모든 시스템리소스를 해방한다"는 것입니다.확인은 안 되지만..좀 더 깊이 들여다볼 수 있는 힌트를 주죠. 그리고 만약 여러분이 더 깊이 들여다볼 수 있다면.Writer.close()스스로 닫힌다고만 되어 있습니다.

이 경우 OpenJDK를 참조하여 소스 코드를 확인합니다.

BufferedWriter Line 265에 있습니다.out.close()그럼 저절로 닫히는 게 아니라..그건 다른 것이다.클래스에서 "의 발생을 검색하면out87호선 건설업자는 다음과 같은 사실을 알게 될 것이다.out클래스가 다른 컨스트럭터를 호출한 후 할당하는 라이터입니다.out자체 파라미터out변수..

그럼.. 다른 사람들은요?유사한 코드는 BufferedReader Line 514, BufferedInputStream Line 468InputStreamReader Line 199에서 확인할 수 있습니다.다른 사람들은 내가 모르지만 이것만으로도 그들이 알고 있다고 추측하기에 충분할 것이다.

닫아야 할 것은BufferedReader를 참조해 주세요.

다른 사람들이 지적했듯이 JavaDocs는 애매하다.리소스 사용 블록은 필요할 때 사용하는 것이 가장 좋습니다.close바로 호출할 수 있지만, 리더를 열어 둘 필요가 있는 경우(예를 들어 기본 리더를 사용하는 스트림을 반환하는 메서드가 있는 클래스)에는 호출하는 것은 일반적으로 호출은 호출하는 것은 호출자의 책임입니다.close거기)를 참조해 주세요).

소스 코드에 액세스 할 수 없고, 리더와 JVM이 호출하는지 여부를 확인하고 싶은 경우close당신의 상황에 있는 다양한 독자와 스트림에 대해, 당신은 그 정보를 덮어쓸 수 있습니다.close간단한 테스트로서 방법을 사용합니다.

Path path = Paths.get("/home/example/test.txt");

InputStream fileInputStream = new FileInputStream(path.toFile()) {
    public void close() throws IOException {
        System.out.println("FileInputStream::close()");
        super.close();
    }
};
Reader inputStreamReader = new InputStreamReader(fileInputStream, Charsets.UTF_8) {
    public void close() throws IOException {
        System.out.println("InputStreamReader::close()");
        super.close();
    }
};
BufferedReader bufferedReader = new BufferedReader(inputStreamReader) {
    public void close() throws IOException {
        System.out.println("BufferedReader::close()");
        super.close();
    }
};

bufferedReader.close();

위의 내용을 실행하면 다음과 같은 내용이 표시됩니다.

BufferedReader::close()
InputStreamReader::close()
FileInputStream::close()

JavaDoc에는 명시적인 사양이 없기 때문에 모든 JVM에서의 동작을 확신할 수 없습니다.그러나, 대부분의 리더/스트림은 위의 패턴을 따르는 것 같습니다(예를 들어, 추가 가능).GZIPInputStream.「 」 、 「 」 、 「 」를 해 주세요.GZIPInputStream::close()호출도 됩니다).

언급URL : https://stackoverflow.com/questions/1388602/do-i-need-to-close-both-filereader-and-bufferedreader

반응형