2011-03-20 4 views
2

FileInputStream을 가지고 있는데, 닫아야하는지 아닌지 궁금합니다. 그렇다면이 스트림 객체를 다른 메서드에 전달하면 해당 하위 메서드에서 닫을 수 있습니까?항상 스트림을 닫아야합니까?

+0

예, 스트림을 닫으면를 사용 후 좋은 습관이다하는 것이 좋습니다. –

답변

2

예, 스트림을 전달한 메소드에서 스트림을 닫을 수 있습니다.

하지만주의하십시오. 메서드 호출 후에 같은 스트림을 사용하면 닫히게됩니다.

가장 좋은 방법은 원하는 모든 작업을 완료 한 후 스트림을 닫는 것입니다.

1

예. 닫아야하며 하위 메서드로 전달하면 닫을 수 있습니다. 리더에 전달하면 Reader에서 close를 호출하면 스트림도 닫힙니다.

0

OS에서 열려있는 리소스를 확보하려면 항상 스트림을 닫아야합니다. 스트림을 열면 항상 코드에있는 모든 식별자 (식별자가 유효한 경우)를 닫는 데 사용할 수있는 식별자가 다른 메서드 또는 클래스에서 반환되는지 여부가 반환됩니다.

2

예 - 스트림에 더 이상 기록되지 않을 것이 확실하다면.

아니오 - 예. 서블릿에서 outputStream 사용 - 당신은이 스트림을 가져다 쓸 수 있지만 닫지는 않습니다. 나중에 뭔가가 동일한 스트림에 액세스 할 수 있기 때문입니다. 주요 규칙은 다음과 같습니다. 직접 열어 놓은 스트림을 항상 닫으십시오.

1

원하는 곳에서 스트림을 닫을 수 있습니다. 그러나 가독성을 높이기 위해 열어 둔 스트림을 닫아야합니다. 당신은 여전히 ​​다른 방법으로 스트림을 처리 할 수 ​​있습니다 : PerformActionOnStream()에서 스트림을 종료 할 이유가 없습니다

try { 
    InputStream stream = //open the stream; 
    PerformActionOnStream(s); 
} catch (IOException e) { 
    //handle error 
} finally { 
    stream.close(); 
} 

. 너가 끝나면 그냥 돌아와. java 7에서

단순히

try(InputStream stream = new MyStream()) { 
    // code 
} catch (Exception e) { 
    // 
} 
+0

비동기적인 경우는 어떻습니까? PerformActionOnStream에서 즉시 반환해야합니까? – user496949

+0

흥미로운 질문입니다. 이 경우 그것은 당신이 달성하기를 원하는 것에 달려 있습니다. 다른 스레드를 사용하여 스트림을 읽으려면 스레드가 파일을 여는 것이 좋습니다. 그럴 가능성이없는 경우 소유권을 스레드로 넘겨주는 주석을 써야합니다. – paztulio

+0

또한 try 블록에서 InputStream을 정의 할 수 없습니다. 마지막으로 사용할 수 없기 때문에 범위에서 볼 수 있습니다. – MeBigFatGuy

관련 문제