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()
BufferedReader 및 InputStreamReader의 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()
그럼 저절로 닫히는 게 아니라..그건 다른 것이다.클래스에서 "의 발생을 검색하면out
87호선 건설업자는 다음과 같은 사실을 알게 될 것이다.out
클래스가 다른 컨스트럭터를 호출한 후 할당하는 라이터입니다.out
자체 파라미터out
변수..
그럼.. 다른 사람들은요?유사한 코드는 BufferedReader Line 514, BufferedInputStream Line 468 및 InputStreamReader 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
'programing' 카테고리의 다른 글
삽입된 ID를 TypeORM & NestJS raw 쿼리: wait connection.manager와 함께 반환합니다.쿼리('삽입처') (0) | 2022.10.30 |
---|---|
Python: 문자열에서 클래스 속성에 액세스합니다. (0) | 2022.10.30 |
mysqld.sock을 찾을 수 없음: 소켓 '/var/run/mysqld/mysqld'를 통해 로컬 MySQL 서버에 연결할 수 없습니다.sock' (2 "그런 파일 또는 디렉토리가 없습니다") (0) | 2022.10.30 |
도커 이미지 내에서 MariaDB가 시작되지 않음 (0) | 2022.10.30 |
표준 시간대가 있는 PHP 날짜()? (0) | 2022.10.30 |