다음 예제에서 FileOutputStream을 닫아야합니까? 그리고 왜?스트림을 닫아야합니까?
FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
다음 예제에서 FileOutputStream을 닫아야합니까? 그리고 왜?스트림을 닫아야합니까?
FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
예외가 발생하지 않은 경우 FileOutputStream
은 ooo.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);
}
예, 스트림을 닫아야합니다. FileOutputStream
을 닫지 않으면 스트림에 성공적으로 기록 된 일부 데이터가 파일에 저장되지 않을 가능성이 있습니다. 프로그램이 여러 파일 스트림을 열면 파일 스트림을 닫지 않으면 원시 리소스가 부족하여 (너무 많은 파일을 동시에 열어서) 오류가 발생할 수 있습니다.
FileOutputStream
은 close
메서드에 의해 출시되는 네이티브 리소스를 관리합니다. 클래스에는 리소스도 해제하는 finalizer가 있습니다. 네이티브 리소스를 공개하는 과정에서 스트림은 버퍼링 된 데이터를 작성합니다. 그러나 JVM은 finalizer가 모든 객체에서 호출되도록 보장하지 않으므로 close
을 호출하지 않으면 버퍼링 된 데이터를 쓰지 않을 위험이 있습니다.
당신이 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를 사용하는 것이 좋습니다.
[닫기] (https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html)'.close()'는 IOException을 던질 수 있으므로 두 번째 블록은 어떻게 든 처리해야합니다 'fos.close()'의 경우와 비교해 보겠습니다. –
만약 당신이'OutputStream'을 의미한다면 ** yes ** 당신은 가장 확실하게합니다. 사실 ** 항상 ** [시도해 자원 함께] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)를 사용해야합니다. –
try-with-resources 문을 사용하는 것이 좋겠지 만,'oos.close()'는 어쨌든'FileOutputStream'을 닫을 것입니다. –
@BoristheSpider이 기사가 기사에서 닫히지 않는 이유 [http://www.ibm.com/developerworks/java/library/j-5things1/index.html?S_TACT=105AGX99&S_CMP=CP] – furry