자바 의 닫 기 흐름
5229 단어 JavaSE
1. try 에서 스 트림 을 끄 고 finally 에서 스 트림 을 끄 지 않 습 니 다.
try {
OutputStream out = new FileOutputStream("");
// ...
out.close();
} catch (Exception e) {
e.printStackTrace();
}
올 바른 쓰기:
OutputStream out = null;
try {
out = new FileOutputStream("");
// ...
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
2. 여러 개의 스 트림 을 닫 을 때 귀 찮 기 때문에 모든 스 트림 코드 를 try 에 버 립 니 다.
OutputStream out = null;
OutputStream out2 = null;
try {
out = new FileOutputStream("");
out2 = new FileOutputStream("");
// ...
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();// , out2
}
if (out2 != null) {
out2.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
올 바른 쓰기:
OutputStream out = null;
OutputStream out2 = null;
try {
out = new FileOutputStream("");
out2 = new FileOutputStream("");
// ...
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();// , out2
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (out2 != null) {
out2.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
3. 순환 중 에 흐름 을 만 들 고 순환 밖에서 닫 으 면 마지막 흐름 이 닫 힙 니 다.
OutputStream out = null;
try {
for (int i = 0; i < 10; i++) {
out = new FileOutputStream("");
// ...
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
올 바른 쓰기:
for (int i = 0; i < 10; i++) {
OutputStream out = null;
try {
out = new FileOutputStream("");
// ...
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. 자바 7 에서 흐름 을 끄 는 번 거 로 운 일 은 더 이상 우리 가 코드 를 두 드 리 지 않 아 도 된다.
try (OutputStream out = new FileOutputStream("")){
// ...
} catch (Exception e) {
e.printStackTrace();
}
실 현 된 자동 닫 기 인터페이스 (Closeable) 의 종 류 는 모두 try 구조 체 에서 정의 할 수 있 습 니 다. 자바 는 자동 으로 닫 혀 있 고 이상 이 발생 할 때 도 있 습 니 다.try 구조 체 에서 여러 개 를 정의 할 수 있 습 니 다. 분점 으로 분리 하면 됩 니 다. 예 를 들 어:
try (OutputStream out = new FileOutputStream("");OutputStream out2 = new FileOutputStream("")){
// ...
} catch (Exception e) {
throw e;
}
주의: Android SDK 20 버 전 은 자바 7 에 대응 하 며 20 버 전 이하 에 서 는 try - catch - resources 를 사용 하여 자동 으로 스 트림 을 끌 수 없습니다.
5. 메모리 흐름 은 끄 지 않 아 도 됩 니 다 (끄 든 끄 지 않 든 상관 없습니다)
ByteArray OutputStream 과 ByteArray InputStream 은 스 트림 으로 위장 한 바이트 배열 (바이트 데이터 로 볼 때) 입 니 다. 파일 핸들 과 포트 를 잠 그 지 않 습 니 다. 더 이상 사용 되 지 않 으 면 바이트 배열 은 쓰레기 로 회수 되 기 때문에 닫 을 필요 가 없습니다.
6. 인 테 리 어 스 트림 사용 시 맨 뒤의 인 테 리 어 스 트림 만 닫 으 면 된다
장식 흐름 은 장식 모델 을 통 해 이 루어 진 자바 흐름 을 말 하 며 포장 흐름 이 라 고도 부 릅 니 다. 장식 흐름 은 원생 류 에 추가 적 인 기능 (또는 효과) 을 추가 할 뿐 자바 의 버퍼 흐름, 브리지 흐름 도 장식 흐름 에 속 합 니 다.
InputStream is=new FileInputStream("C:\\Users\\tang\\Desktop\\ .txt");
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String string = br.readLine();
System.out.println(string);
try {
br.close();// br
} catch (Exception e) {
e.printStackTrace();
}
장식 흐름 이 닫 힐 때 원생 흐름 을 호출 하여 닫 습 니 다. 원본 코드 를 보십시오:
//BufferedReader.java
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close();// in
} finally {
in = null;
cb = null;
}
}
}
//InputStreamReader.java
public void close() throws IOException {
sd.close();// sd (StreamDecoder), close close
}
이렇게 층 층 이 닫 히 는 메커니즘 이 있 으 면 우 리 는 가장 바깥쪽 의 흐름 만 닫 으 면 된다.
7. 흐름 을 닫 을 때의 순서 문제
두 개의 무관 한 흐름 의 닫 기 순 서 는 아무런 영향 이 없다. 예 를 들 어:
out1 = new FileOutputStream("");
out2 = new FileOutputStream("");
// out1 out2 ,
만약 두 흐름 이 의존 관계 가 있다 면, 위 에서 말 한 것 처럼 가장 바깥쪽 만 닫 으 면 된다.
귀 찮 지 않 고 하나씩 닫 아야 한다 면 먼저 가장 안쪽 을 닫 고 안에서 밖으로 층 층 이 닫 혀 야 한다.
왜 바깥쪽 에서 안쪽 으로 점차 닫 을 수 없 습 니까?원인 은 위 에서 말 한 장식 흐름 이 이미 명확 하 게 말 했다. 외층 을 닫 을 때 내층 의 흐름 은 사실상 동시에 닫 혔 다. 네가 다시 내 층 의 흐름 을 닫 으 면 잘못 보고 할 것 이다.
인터넷 에서 말 하 는 선성 명 이 먼저 닫 는 것 이 바로 이 이치 이다. 먼저 성명 한 것 은 내층 이 고 가장 먼저 밝 힌 것 은 최 내층 이 며 마지막 으로 성명 한 것 은 최 외층 이다.
8. 왜 흐름 을 꼭 닫 아야 하 는 지 깊이 따 져 본다.
스 트림 이 파일 핸들 (또는 네트워크 포트) 에 연결 되 어 있 습 니 다. 스 트림 이 닫 히 지 않 으 면 이 파일 (또는 포트) 은 항상 잠 겨 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WeakHashMap,IdentityHashMap,EnumMap다른 맵 구현 클래스와 달리 WeakHashMap 클래스의 키 대상은 간접적으로 약한 인용의 지시 대상으로 저장되며, 키가 정상적으로 사용되지 않을 때 자동으로 항목을 제거합니다.더 정확히 말하면, 주어진 키에 대한...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.