Javaストリームでのflush()の目的は何ですか?


120

Javaでは、flush()メソッドはストリームで使用されます。しかし、私はこの方法を使用するすべての目的が何であるかを理解していませんか?

fin.flush();

いくつかの提案を教えてください。

回答:


100

以下からのドキュメントflush方法:

出力ストリームをフラッシュし、バッファリングされたすべての出力バイトを強制的に書き出します。flushの一般的な規約は、それを呼び出すことは、以前に書き込まれたバイトが出力ストリームの実装によってバッファリングされている場合、そのようなバイトが目的の宛先にすぐに書き込まれる必要があることを示すということです。

バッファリングは主にI / Oパフォーマンスを向上させるために行われます。詳細については、この記事「Tuning Java I / O Performance」を参照してください。


1
Java I / Oパフォーマンスのチューニングへの新しいリンクoracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr

+1ありがとうございます。バイトが送信されなかった理由を理解できませんでした。バッファをフラッシュする必要があったためです。
rayryeng 2014年

3
flushメソッドは、バッファリングされたストリームでのみ使用されますか?他のストリーム(たとえば、出力ストリーム)で使用する利点はありますか?
tnishada 2016年

多分「フラッシュ」という言葉はその定義に含まれていてはいけません。再帰的な定義は、新しいことを理解するための悪い考えです。あなたが定義を書いていないことを知っています。
ジョナサンコマー

27

コマンドを与えると、そのコマンドのストリームは、コンピュータのバッファ(一時的なメモリの場所)と呼ばれるメモリの場所に格納されます。すべての一時メモリの場所がいっぱいになったら、flush()を使用します。これは、データのすべてのストリームをフラッシュして完全に実行し、バッファの一時的な場所にある新しいストリームに新しいスペースを割り当てます。-理解してほしい


1
のみの場合はBufferedOutputStreamBufferedWriterObjectOutputStream,およびPrintXXXクラス。flush()他のストリームのメソッド、またはWriter何もしません。
ローン侯爵

@EJPステートメントをバックアップするためのリファレンスはありますか?それは私たち初心者のために役立つでしょう:)
mr5 '21

1
@ mr5私ではなく、彼の陳述をバックアップする必要があるのはポスターですが、私が言ったことはすべてJavadocに明確に記載されています
ローンの侯爵

作成者である限り、flush()に対して明示的に呼び出す必要はありません。フラッシュ自体を実行します。BufferedWriterclose()close()
Yossarian42

close()呼び出しflush()に注意してくださいFileWriter。バッファなしで使用する場合、両方を呼び出すことは冗長です。
Yossarian42

26

ストリームにデータを書き込んでも、すぐには書き込まれず、バッファリングされます。したがってflush()、バッファからのすべてのデータが確実に書き込まれるようにする必要がある場合に使用します。

ストリームを閉じる前にすべての書き込みが完了していることを確認する必要があります。そのためflush()、ファイル/バッファ付きライターでが呼び出されますclose()

ただし、ストリームを閉じる前にすべての書き込みを保存する必要がある場合は、を使用してくださいflush()


8
閉じる直前にflushを呼び出すのは冗長ですよね?これは単にcloseを呼び出すのと同じです。
John Henckel、2014年

2
@BimanTripathy私は100%の保証でそれを言うことができます。FilterOutputStreamおよびのJavadocによって保証されていFilterWriterます。
ローン侯爵

7

バッファがいっぱいの場合、バッファされているすべての文字列はディスクに保存されます。バッファーは、ビッグディールを回避するために使用されます。とオーバーヘッド。

java libsに配置されたBufferedWriterクラスには、次のような1行があります。

private static int defaultCharBufferSize = 8192;

バッファがいっぱいになる前にデータを送信したい場合は、制御できます。ちょうどそれをフラッシュします。writer.flush()の呼び出しは、次のように言います。

参考書:https : //www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

ページ数:453


4

ストリームは、コンテンツを定期的に空にし、画面に表示したり、ソケットに送信したり、ファイルに書き込んだりするスレッドによってアクセスされることがよくあります。これは、パフォーマンス上の理由で行われます。出力ストリームをフラッシュするとは、停止して、ストリームのコンテンツが宛先に完全に転送されるのを待ってから、ストリームを空にしてコンテンツを送信して実行を再開することを意味します。


5
これはファンタジーです。ストリームは魔法のスレッドからはアクセスされません。アプリケーションによって作成されたもののみ。
ローン侯爵

3

パフォーマンスの問題のために、最初のデータはバッファに書き込まれます。バッファがいっぱいになると、データが出力に書き込まれます(ファイル、コンソールなど)。バッファが部分的に満たされ、それをoutput(file、console)に送信する場合、部分的に満たされたバッファをoutput(file、console)に書き込むには、flush()メソッドを手動で呼び出す必要があります。


本当じゃない。FileOutputStream.flush()は空の何もしません。
vertuso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.