2011-02-23 4 views
20

저는 테스트 자동화에서 연수생으로 일하고 있습니다. Eclipse로 Junit 코드를 만들고 Eclipse를 사용하여 실행하고 있습니다. FileInputStream 함수를 사용하여 Excel 시트에서 데이터를 검색하고 있습니다.FileInputStream을 닫아야합니까?

FileInputStream fi=new FileInputStream("c:\\search.xls"); 
Workbook w=Workbook.getWorkbook(fi); 
Sheet s=w.getSheet(0); 

Inputstream 기능을 닫아야합니까? 그렇다면 몇 가지 코딩으로 안내해주십시오.

답변

22

예, 시스템 리소스를 다시 해제하려면 입력 스트림 close이 필요합니다.

FileInputStream.close()이 필요합니다.

7
FileInputStream fi=null; 
try { 
    fi=new FileInputStream("c:\\search.xls"); 
    Workbook w=Workbook.getWorkbook(fi); 
    Sheet s=w.getSheet(0); 
} finally { 
    if (fi!=null) { 
     fi.close(); 
    } 
} 
+4

작은 댓글 - 체크 된 IOException을 던집니다. close()가 선언 할 때'close()'문을 try/catch와 함께 포장해야합니다. 실제로, 당신은 마침내 그런 식으로 사용할 수 없습니다. try/finally와 함께 런타임 예외 만 가질 수 있습니다. 하지만 IOException 및 하위 클래스와 같은 확인 된 예외를 사용하면 try/catch 또는 try/catch/finally가 있어야합니다. try/finally로 컴파일되지 않습니다. –

+2

메서드에 대해 IOException이 선언되었는지 여부에 따라 다릅니다. 당신이 그것을 잡으면, 당신은 그것으로 무엇을해야 하는지를 알아야한다. 중요한 부분은 close()를 finally 블록에 넣는 것입니다. 실제로 이것에 대한 자동 처리는 Java 7에서 실제로보고 싶어하는 기능 중 하나입니다. – Axel

6

사용자는 프로그램을 닫거나() 종료해야합니다.

당신이

  • 때때로 시험의 파일을 닫지 않는 경우 혼란 문제로 실행할 수 있습니다 그러나

    개별적으로 실행하거나 테스트 그룹은 동일한 프로세스에서 실행됩니다. (따라서 한 방향으로 작동하지만 다른 방향으로는 작동하지 않는 테스트를 수행 할 수 있습니다)
  • 열린 파일의 이름을 바꾸거나 삭제할 수 없습니다.

항상 작업을 완료 한 리소스를 닫는 것이 가장 좋지만 단원 테스트는 항상 모범 사례를 따라야하는 것은 아니라는 스크립트로 보입니다.

-1

기본 CompSci 101은 우리가 열어 놓은 리소스를 Java 나 다른 언어로 닫으라고 알려줍니다. 그래서 네, 그들을 닫아야합니다. 나쁜 주주는 그렇게하지 않으면 일어날 수밖에 없습니다.

또한 Javadoc을 사용하는 법을 배워야합니다. FileInputStream 및 Closeable에 대한 Javadoc을 찾으십시오. 대답은 거기에 있습니다.

+2

비평이나 이해가없는 확립 된 규칙을 맹목적으로 따르는 것은 정말 끔찍한 접근입니다. * 나쁜 일들이 일어날거야 - 오 ~ 공통점! 프로그래밍은 결과를 언급하지 않고 부두교의 마술이 아닙니다 (** 파일은 이동할 수 없습니다. 일반적으로 메모리 누수가 발생할 수 있습니다. 파일 핸들 풀이 제거 될 수도 있습니다.) (https://stackoverflow.com/questions/ 1661322/too-many-open-file-handles) **) 적절하게 해제되지 않은 자원의 답변은 쓸데없고 해롭다. ** Downvoted. ** –

+1

Oooo, 저는 연설 형식을 사용하고 당신은 "그가 부두교를 믿는 ZOMG"("hhhh와 반대"라고 말하면서 그것을 철자하지 않고 일부 언어를 선택했습니다.) 그 결과를 설명하지 않는 몇 가지 다른 답변이 있습니다. 그리고 네가 neg-rep에 나가기 전까지는 편견이있는 높은 말에 비누 상자를 몇 개 올리는 것뿐입니다. 이 글의 사람들은 그렇지 못했습니까?) 적절한 문학을 쉽게 찾을 수 있기 때문에 소량의 연구를하는 누구나 이용할 수 있습니다. –

5

그것은 항상 당신이 사용하는 자원 하지만 종료하는 것이 좋습니다 :

당신이 자원 을 사용하는 경우를 자원에B, 그것은 B 대신 이 경우를 닫 합리적이다 그것을위한 방법이 있습니다. 당신이 Workbook을 닫고 FileInputStream을 닫을 것이라고 Workbok에 의존하는 것이 좋습니다 거라고 귀하의 경우

, 당신은 Workbook에서 FileInputStream 사용합니다.

실제로이 특별한 경우

,의 getWorkbook() 방법의 끝에 Workbookwill closeFileInputStream하지만 쓰레기 수집 할 수 있도록 여전히 closeWorkbook하는 것이 좋습니다.

3

예! 자원을 다 마친 후에는 항상 자원을 한 번 릴리스해야합니다. Java는 가비지 수집을위한 강력한 메커니즘을 가지고 있습니다 (리소스 관리/누출과 다른 점에 유의하십시오). 가비지 수집기는 앞으로 리소스가 필요한지 여부를 확인할 수 없습니까? 리소스를 해제하지 못하면 서비스 거부, 성능 저하 등의 문제가 발생할 수 있습니다.

로 이미 대답하지만 다른 노력을 덜 방법은

try (FileInputStream fi = new FileInputStream("c:\\search.xls")) { 

     //do something with fi. 
     //fi.getChannel() ; 

    } catch(IOException e) { 
     // exception handling. 
    } finally { 
    // some statements for finally. 
    } 

try with resources 지금 당신이 명시 적으로 fi.close() 메서드를 호출 할 필요가 없습니다 것입니다.

0

최근에 내 코드를 리팩터링하려고하면 통합 문서 작성을 다른 방법으로 옮겨야하고 FileInputStream이 해당 메서드에서 만들어집니다. 이 메서드는 FileInputStream을 만들고 통합 문서를 반환합니다. 그러나 FileInputStream은 main 메소드에서 볼 수 없습니다. 그래서 어떻게 main 메소드의 끝에서 내 FileInputStream을 닫을 것인가? 대답은 FileInputStream을 닫을 필요가 없다는 것입니다. 내부적으로 FileInputStream을 닫는 통합 문서를 닫는 것뿐입니다. 간단히 말해서 무엇이든지 FileInputStream을 닫아야한다는 것은 잘못된 것입니다.

관련 문제