Javaで多くの記事を読むと、close
メソッドを呼び出すことができます。flush
OutputStream
のJDK子孫の呼び出しはありません。実際に私はいつも上書きします(私が必要なときはまれです)close
最後のクローズの前にflush
を呼んでいます。私は安全にclose
をflush
なしで呼ぶことができることを明確に述べた公式の文書を見たいと思っています。フラッシュなしで閉じるのドキュメントはどこにありますか
ここにいくつかのドキュメントがありますか?
Javaで多くの記事を読むと、close
メソッドを呼び出すことができます。flush
OutputStream
のJDK子孫の呼び出しはありません。実際に私はいつも上書きします(私が必要なときはまれです)close
最後のクローズの前にflush
を呼んでいます。私は安全にclose
をflush
なしで呼ぶことができることを明確に述べた公式の文書を見たいと思っています。フラッシュなしで閉じるのドキュメントはどこにありますか
ここにいくつかのドキュメントがありますか?
非常に良い質問! はい、flush()
への電話はと思われます。
さて、JavadocのはどれもOutputStreamに関係しないか、それがCloseableのように実装して様々なインタフェースは、ストリームを閉じる前flush()
を呼び出すことについては何も言及します。これはかなり長い間今のようでした。
しかし、あなたがなどBufferedWriter、PrintWriter、のような他のWriter
クラスclose()
ドキュメントを見れば、特にそれが閉じられる前に、ストリームがフラッシュされると述べています。これは、すべてがWriterクラスを実装しており、そこにあるドキュメントがこの動作を指定しているためです。
あなたの推測はここの私のものと同じくらい良いです。しかし、私はストリームを閉じる前にフラッシュしていないときは、何の問題にも直面していません。だから、flush()
への呼び出しが実際に行われたと思われます。おそらく、Flushable
インターフェイスの結果です。
私が見つけた一つの共通の特徴は、クラスがWriter
インタフェースを実装している場合、ドキュメントは必ずclose()
がflush()
最初を呼び出した後、ストリームを閉じているという事実に言及していることです。
EDIT !!!
OutputStream
が抽象クラスであるため、少し掘り下げました。私はOutputStream
を延長することが起こったFilterOutputStreamを見つけました。そのためsource codeからclose()
方法...
public void close() throws IOException {
try {
flush();
} catch (IOException ignored) {
}
out.close();
}
}
BufferedOutputStream、DataOutputStream
、PrintStream
はFilterOutputStream
を拡張し、結果として、同じclose()
方法を継承します。最低でも、これらのクラスのclose()
がに電話をかけてください。
続いて@Debosmit Raysがリードしてソースを確認しました。
にフラッシュしません。
いくつかの問題があります。 'FilterOutputStream' **はcloseメソッドでフラッシュします**。 'OutputStream'は抽象クラスです。明らかに実装はありません。 –
これは助けになるかもしれませんが、私は統一された答えで質問の周りに多くの混乱を参照してください:http://stackoverflow.com/questions/2732260/in-java-when-i-call-outputstream-close-do- i-always-need-to-call-outputstream – epoch
これは、たとえば のように指定されているものもあります。http://docs.oracle.com/javase/8/docs/api/java/io/OutputStreamWriter.html#close% 28%29 https://docs.oracle.com/javase/7/docs/api/java/io/FilterOutputStream.html 反対の例もあります。 https://docs.oracle.com/javase /7/docs/api/java/io/ObjectOutputStream.html#close%28%29 – Fakenick
私の回答を編集しました –