자바 의 닫 기 흐름

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. 왜 흐름 을 꼭 닫 아야 하 는 지 깊이 따 져 본다.
스 트림 이 파일 핸들 (또는 네트워크 포트) 에 연결 되 어 있 습 니 다. 스 트림 이 닫 히 지 않 으 면 이 파일 (또는 포트) 은 항상 잠 겨 있 습 니 다.
 
 
 
 
 

좋은 웹페이지 즐겨찾기