2012-07-24 2 views
5

다음과 같은 Java 클래스가 있는데, 하나는 config.properties에서 값을 발급합니다.try/catch/finally 블록으로 fileInputStream.close를 둘러싸 야합니까? 어떻게 된거 야?

fileInputStream을 닫을 때, 나는 위키피디아에서 마침내 블록에있는 것이 좋다는 것을 읽은 것으로 생각합니다. 솔직히 try/catch 블록에서 제대로 작동하기 때문입니다.

마침내 섹션에 fileInputStream.close()을 표시하도록 수정을 표시 할 수 있습니까?

ConfigProperties.java 패키지베이스;

import java.io.FileInputStream; 
import java.util.Properties; 

public class ConfigProperties { 

    public FileInputStream fileInputStream; 
    public String property; 

    public String getConfigProperties(String strProperty) { 

     Properties configProperties = new Properties(); 
     try { 

      fileInputStream = new FileInputStream("resources/config.properties"); 
      configProperties.load(fileInputStream); 
      property = configProperties.getProperty(strProperty); 
      System.out.println("getConfigProperties(" + strProperty + ")"); 

      // use a finally block to close your Stream. 
      // If an exception occurs, do you want the application to shut down? 

     } catch (Exception ex) { 
      // TODO 
      System.out.println("Exception: " + ex); 
     } 
     finally { 
      fileInputStream.close(); 
     } 

     return property; 
    } 
} 

마지막으로 블록에서 Eclipse가 제안하고 수행하는 해결책은 있습니까?

finally { 
    try { 
     fileInputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

감사합니다.

+1

: 공유지-IO try 블록 종료 때, 자바 7의 도입으로, 자동으로 선언 된 자원을 닫습니다 try-with-resource 문은 이제이 있습니다 IOUtils.closeQuietly()는 try/catch를 처리 할 좋은 함수를 가지고있다. 코드가 훨씬 멋지게 보일 것입니다 :)이 함수는 IOException에 응답 할 기회를주지는 않지만 일반적으로 사람들은 그렇게하지 않고 예외를 무시합니다. 응답해야하는 경우 스택 추적 또는 필요한 작업을 기록하거나 인쇄하는 자체 유틸리티 메서드를 만듭니다. – Matt

답변

7

FileInputStream.close()이 IOException을 throw하고 finally {} 블록이 예외를 catch하지 않기 때문에. 따라서 컴파일하거나 컴파일하기 위해 선언해야합니다. 이클립스의 제안은 훌륭하다. finally {} 블록 내에서 IOException을 catch하십시오.

+0

[IOUtils.closeQuietly()] (http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/IOUtils.html#close Quietly()를 사용할 수도 있습니다. java.io.Closeable)) 메소드를 Commons IO에서 가져온다. throw되는 모든 IOException을 삭제하는 close 메소드를 래핑합니다. 다른 try/catch 블록을 사용하는 것보다 클리너가. –

11

그렇습니다. 이것이 Java 이전의 일반적인 솔루션입니다.

try (FileInputStream fileIn = ...) { 
    // do something 
} // fileIn is closed 
catch (IOException e) { 
    //handle exception 
} 
7

표준 접근 방식은 다음과 같습니다 : 참고로

FileInputStream fileInputStream = null; 
try { 
    fileInputStream = new FileInputStream(...); 
    // do something with the inputstream 
} catch (IOException e) { 
    // handle an exception 
} finally { // finally blocks are guaranteed to be executed 
    // close() can throw an IOException too, so we got to wrap that too 
    try { 
     if (fileInputStream != null) { 
      fileInputStream.close(); 
     }   
    } catch (IOException e) { 
     // handle an exception, or often we just ignore it 
    } 
} 
관련 문제