2016-11-06 2 views
0

다음 예제에서 FileOutputStream을 닫아야합니까? 그리고 왜?스트림을 닫아야합니까?

FileOutputStream fos = new FileOutputStream("bytes.info"); 
ObjectOutputStream oos = new ObjectOutputStream(fos); 
oos.writeObject(data); 
oos.close(); 
+2

만약 당신이'OutputStream'을 의미한다면 ** yes ** 당신은 가장 확실하게합니다. 사실 ** 항상 ** [시도해 자원 함께] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)를 사용해야합니다. –

+0

try-with-resources 문을 사용하는 것이 좋겠지 만,'oos.close()'는 어쨌든'FileOutputStream'을 닫을 것입니다. –

+0

@BoristheSpider이 기사가 기사에서 닫히지 않는 이유 [http://www.ibm.com/developerworks/java/library/j-5things1/index.html?S_TACT=105AGX99&S_CMP=CP] – furry

답변

2

예외가 발생하지 않은 경우 FileOutputStreamooo.close()으로 종료됩니다.

writeObject에 예외가 발생하면 스트림이 닫히지 않습니다. 따라서 close 호출은 finally 블록에 있어야합니다.

ObjectOutputStream이 생성자에서 예외를 throw 할 수있는 또 다른 문제가 있습니다. 예외를 발생시킬 수있는 스트림 헤더를 생성자에 씁니다. 이 경우 FileOutputStream을 닫아야하지만 ObjectOutputStream에 대한 참조가 없으므로 oos.close()을 호출 할 수 없습니다. 따라서 실제로는 close에 대한 두 개의 개별 호출 (각 스트림에 하나씩)이 finally 블록에 모두 필요합니다.

는 사용 시도 --자원을 당신을 위해이 모든 처리합니다 : 물론

try(
    FileOutputStream fos = new FileOutputStream("bytes.info"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos) 
) { 
    oos.writeObject(data); 
} 
2

예, 스트림을 닫아야합니다. FileOutputStream을 닫지 않으면 스트림에 성공적으로 기록 된 일부 데이터가 파일에 저장되지 않을 가능성이 있습니다. 프로그램이 여러 파일 스트림을 열면 파일 스트림을 닫지 않으면 원시 리소스가 부족하여 (너무 많은 파일을 동시에 열어서) 오류가 발생할 수 있습니다.

FileOutputStreamclose 메서드에 의해 출시되는 네이티브 리소스를 관리합니다. 클래스에는 리소스도 해제하는 finalizer가 있습니다. 네이티브 리소스를 공개하는 과정에서 스트림은 버퍼링 된 데이터를 작성합니다. 그러나 JVM은 finalizer가 모든 객체에서 호출되도록 보장하지 않으므로 close을 호출하지 않으면 버퍼링 된 데이터를 쓰지 않을 위험이 있습니다.

0

당신이 FileOutputStream에 파일을 닫해야합니다. 때로는 파일에 저장 한 데이터가 저장되지 않을 수 있으며 프로그램을 실행 한 후 빈 파일로 끝납니다. 그리고 리소스를 사용하여 try를 사용할 수 있으므로 수동으로 닫지 않아도되고 예외 처리 부분을 한꺼번에 수행 할 수 있습니다.

try (FileOutputStream fos = new FileOutputStream("bytes.info"); 
ObjectOutputStream oos = new ObjectOutputStream(fos));{ 

}catch(){} 

그냥 자원이 마지막으로 수동 블록에서 파일 스트림을 닫습니다 당신이 시도를 사용하지 않는 경우 경우이다.

FileOutputStream fos = null; 
ObjectOutputStream oos = null; 

try{ 
     fos = new FileOutputStream("bytes.info"); 
     oos = new ObjectOutputStream(fos)); 

     oos.writeObject(data); 
    }catch(){ 
    }finally{ 
     if(fos != null){ 
     fos.close(); 
     } 
     if(oos != null){ 
     oos.close(); 
     } 
    } 

해당 파일 스트림이 null인지 여부를 확인해야합니다. null 인 경우는 또 다른 에러가 있기 때문에 리소스가있는 try를 사용하는 것이 좋습니다.

+1

[닫기] (https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html)'.close()'는 IOException을 던질 수 있으므로 두 번째 블록은 어떻게 든 처리해야합니다 'fos.close()'의 경우와 비교해 보겠습니다. –

관련 문제