次の例で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
がコンストラクタで例外をスローする可能性があるという追加の問題があります。例外を引き起こす可能性のあるストリームヘッダーをコンストラクターに書き込みます。この場合、FileOutputStream
を閉じる必要がありますが、ObjectOutputStream
への参照がないため、oos.close()
を呼び出すことはできません。したがって、実際には、close
への2つの別々の呼び出しが必要です。それぞれのストリームに1つずつ、両方ともfinallyブロックにあります。
は、使用してみてください--リソースとは、あなたのためにこれのすべての面倒を見る:もちろん
try(
FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos)
) {
oos.writeObject(data);
}
はい、ストリームを閉じる必要があります。 FileOutputStream
を閉じないと、ストリームに正常に書き込まれたデータの一部がファイルに保存されない可能性があります。プログラムが複数のファイルストリームを開くと、それらを閉じないと、ネイティブリソースが不足するため(同時に開いているファイルが多すぎるため)、失敗する可能性があります。
FileOutputStream
は、close
メソッドによってリリースされたネイティブリソースを管理します。クラスにはファイナライザもあり、リソースも解放されます。ネイティブリソースを解放する一環として、ストリームはバッファリングされたデータの書き込みを終了します。ただし、JVMはすべてのオブジェクトでファイナライザが呼び出されることを保証しないため、close
にコールできないと、バッファされたデータを未書き込みのままにする危険性があります。
あなたがたFileOutputStreamファイルを閉じる必要があります。場合によっては、ファイルに保存したデータが保存されないことがあり、プログラムを実行した後で空のファイルになることがあります。また、リソースを使ってtryを使用したいので、手動で閉じる必要はなく、例外処理部分を一度に実行できます。
try (FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos));{
}catch(){}
リソースを試そうとしていない場合は、finallyブロックのファイルストリームを手動で閉じる必要があります。
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の場合、別のエラーが発生するためです。それでもリソースを使って試してみるのが良いでしょう。
[閉じる](https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html) '.close()'は 'IOException'を投げることができるので、2番目のブロックはどうにか処理する必要があります'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