web-dev-qa-db-ja.com

FileOutputStream:「close」メソッドは「flush」も呼び出しますか?

私は、フラッシュとクローズの方法について本当に混乱しています。私のコードでは、常にFileOutputStreamオブジェクトを閉じています。しかし、ここでフラッシュメソッドを使用する必要がある場合、どこで使用できるかを知りたいのですが。

4、5ファイルを繰り返しダウンロードするプロジェクトを書きます。メソッド(ファイルのダウンロード用)を記述し、私のメソッドはループにあり、ファイルを繰り返しダウンロードします。私のメソッドには次のようなコードがあります。

closeメソッドはflushを呼び出しますか、それとも閉じる前にフラッシュを使用する必要がありますか?

try {
    InputStream inputStream = con.getInputStream();
    FileOutputStream outputStream = new FileOutputStream("C:\\programs\\TRYFILE.csv");

    int bytesRead = -1;
    byte[] buffer = new byte[4096];
    while ((bytesRead = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, bytesRead);
}

} catch(Exception e) {
    //
} finally {
    outputStream.close();
    inputStream.close();
}    

コードが適切に機能することに注意してください。ファイルが正常にダウンロードされます。しかし、flushを使用するかどうかはわかりません。

20
javauser35

flushメソッドは、バッファに保持されているバイトを「フラッシュ」するために使用されます。 FileOutputStreamはバッファを使用しないため、flushメソッドは空です。それを呼び出しても、呼び出さなくても、コードの結果は変わりません。

バッファ付きライターでは、メソッドcloseは明示的にflushを呼び出します。

したがって、データを書き込みたいときは、flushを呼び出す必要がありますストリームを閉じる前かつバッファがいっぱいになる前(バッファがいっぱいになると、ライターはフラッシュ呼び出しを待たずに書き込みを開始します)。

クラスFileOutputStreamのソースコードには、メソッドflushのカスタムバージョンがありません。したがって、使用されるflushメソッドは、そのスーパークラスOutputStreamのバージョンです。 OutputStreamのflushのコードは次のとおりです

public void flush() throws IOException {
}

ご覧のとおり、これは何もしない空のメソッドであるため、それを呼び出すかどうかは同じです。

27