2016-11-06 9 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がコンストラクタで例外をスローする可能性があるという追加の問題があります。例外を引き起こす可能性のあるストリームヘッダーをコンストラクターに書き込みます。この場合、FileOutputStreamを閉じる必要がありますが、ObjectOutputStreamへの参照がないため、oos.close()を呼び出すことはできません。したがって、実際には、closeへの2つの別々の呼び出しが必要です。それぞれのストリームに1つずつ、両方ともfinallyブロックにあります。

は、使用してみてください--リソースとは、あなたのためにこれのすべての面倒を見る:もちろん

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

はい、ストリームを閉じる必要があります。 FileOutputStreamを閉じないと、ストリームに正常に書き込まれたデータの一部がファイルに保存されない可能性があります。プログラムが複数のファイルストリームを開くと、それらを閉じないと、ネイティブリソースが不足するため(同時に開いているファイルが多すぎるため)、失敗する可能性があります。

FileOutputStreamは、closeメソッドによってリリースされたネイティブリソースを管理します。クラスにはファイナライザもあり、リソースも解放されます。ネイティブリソースを解放する一環として、ストリームはバッファリングされたデータの書き込みを終了します。ただし、JVMはすべてのオブジェクトでファイナライザが呼び出されることを保証しないため、closeにコールできないと、バッファされたデータを未書き込みのままにする危険性があります。

0

あなたがた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の場合、別のエラーが発生するためです。それでもリソースを使って試してみるのが良いでしょう。

+1

[閉じる](https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html) '.close()'は 'IOException'を投げることができるので、2番目のブロックはどうにか処理する必要があります'fos.close()'の場合と同様です。 –

関連する問題