2012-05-15 5 views
4

다음 중 어느 것이 inputStream을 닫고 선언하는 바람직한 방법입니다.InputSteam을 선언하고 종료하는 방법은 무엇입니까?

InputStream is = null; 
String md5; 
try{ 
    is = new FileInputStream(FILE.getAbsoluteFile()); 
    md5 = UTILS.getMD5Info(is); 
} finally{ 
    if(is != null) 
     is.close(); 
} 

또는

InputStream is = new FileInputStream(FILE.getAbsoluteFile()); 
String md5; 
try{ 
    md5 = UTILS.getMD5Info(is); 
} finally{ 
    is.close(); 
} 

나는 둘 사이에 많은 차이를 볼 수 없지만, 제 2 방법은 조금 짧은 그와 같은 더 나은 보인다. 예외를 잡으려고하지 않고 inputStream을 가비지 수집에만 관심이 있다면 try 블록 내부에서 입력 스트림을 초기화하는 용도가 있습니까?

+0

첫 번째 것이 좋습니다. –

답변

6

try와 finally간에 IOException이 발생하면 첫 번째 예외는 FileInputStream의 생성자가 IOException을 throw하는 경우도 처리하지만 두 번째는 IOException을 throw하지 않습니다. 그들은 같은 일을하지 않을 것입니다. 그대로, 두 번째는 더 깨끗합니다. 자바 7 기능 try-with-resources 사용에 대한

try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) { 
    md5 = UTILS.getMD5Info(is); 
} 
+0

* 두 번째 *가 더 깨끗하거나 * 첫 번째 *가? – dj18

+0

"그대로 두 번째 것은 더 깨끗합니다"는 무엇이 모호합니까? –

+0

첫 번째가 더 나은 이유를 설명했기 때문에 명확히 설명 했으므로 같은 맥락에서 계속 진행하고 첫 번째가 더 깨끗해지기를 원하는지 궁금해하고있었습니다. 두 번째 "청소기"를 만드는 것에 대해 자세히 설명해 주시겠습니까? – dj18

4

번째 접근 방식의 문제는 FileInputStream 생성자 당신은 당신이 덜 제어 할 수 있습니다이 방법으로 (경우에 당신은 예외를 잡는 것이 좋습니다) 지정된 때문에 try 블록 내에서 잡을 것이다 FileNotFoundException 예외를 던질 수 있다는 것입니다.

나는 첫 번째 것이 될 것입니다.

6

방법 :

자바 7 이후 가장 좋은 방법은 시도 -과 - 자원 문을 사용하는 것입니다?

try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) { 
    ... 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

당신이 절대적으로 정확하려면 꽤 추한이기 때문에 (어떤 독자close()에 추가 IOException을 던질 수 있음을 잊지 마세요!) :

InputStream is = null; 

try { 
    is = new FileInputStream(FILE.getAbsoluteFile()); 

    // Your md5() magic here 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    if (is != null) { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

당신의 두번째 버전에서 생성자가 예외를 throw 할 때 (예 : 파일을 찾을 수 없거나 액세스 할 수있는 권한이없는 경우) 대소 문자를 처리하지 않습니다.

이 케이스도 처리하려면 try-catch 블록 앞에 InputStream을 선언하거나 현재 함수 정의에 throws IOException을 추가해야합니다.

하지만 제대로 초기화되었는지 즉, finally 블록에 null이 아닌지 확인해야합니다.

또한 스트림을 close()으로 지정하려면 가능한 IOException (일반적으로 스트림을 열 수 있었던 경우에는 발생하지 않음)을 처리해야합니다.

관련 문제