2011-01-23 3 views
2

주로 입/출력 스트림을 다루는 프로젝트가 있습니다. 따라서 스트림을 인수로 전달하고 제 3 자 라이브러리에서 스트림을 수신해야합니다. Good design: How to pass InputStreams as argument?Closing Java InputStreams을 읽었지만 제 3자가 동일한 코딩 값을 공유하고 최상의 디자인 패턴을 따르는 지 100 % 확신하지 못했습니다 (특히 "스트림을 여는 사람이 스트림을 닫아야합니다")타사 입력/출력 스트림은 어떻게 처리해야합니까?

  1. 내가 내가로부터받은 스트림을 닫으려고 하는가 : SO 커뮤니티와 나는 CPU 및 메모리 자원에 꽉 해요, 여기에 자바에 대한 몇 가지 질문입니다 - 스트림 (3GB이 500MB) 꽤 큰 있다고 가정

    타사 라이브러리?

  2. 닫히지 않은 스트림 (여분의 GC 작업 부하는 제외)의 가능한 위험 가능성은 무엇입니까?
  3. 이러한 의미는 스트림 크기에 다소 비례합니까?

답변

2
  1. 스트림이 끝에 도달하면 닫아야합니다. 전달 라이브러리가 이것을 원하지 않으면 close()를 무시하도록 스트림을 래핑해야합니다.
  2. 닫히지 않은 스트림은 리소스를 열어 둡니다 (예 : 열려있는 파일은 삭제할 수 없습니다.
  3. 크기는 중요하지 않습니다.
+0

감사합니다. 바이트 배열, 문자열, XML DOM 등의 변수에서 파생 된 스트림은 어떻게됩니까? 내 스트림을 닫을 때까지 이러한 내부 제 3 자 vars가 내 힙 크기를 먹을 것이라고 생각합니까? – Osw

+0

일반적으로 메모리 모델은 GCed를 유지하는 스트림 또는 객체로 정리됩니다. 그들을 닫으면 거의 차이가 없습니다. 그것들을 닫으면 소켓/파일 같은 "외부"자원에 차이가 생깁니다. 최종적으로는 GC에서도 닫히지 만, GC를 수행하기 전에 파일 설명자를 모두 사용할 수 있습니다. –

관련 문제