2017-02-18 1 views
-1

実際にfile.write()とfile.flush()の違いは何ですか?Python:file.write()とfile.flush()

Python's official documentationから、私はこれを取得:

フラッシュを()強制は、生のストリームにバッファに保持されたバイト。 A 生ストリームがブロックする場合は、BlockingIOErrorを発生させる必要があります。

write(b)バイト状オブジェクトbを書き込み、書き込まれた バイトの数を返します。ノンブロッキングモードでは、BufferIOErrorはバッファを書き出す必要があるがRawストリームブロックの場合は になります。

私の初心者の理解のために、彼らは両方とも現在メモリに保持されている情報をディスク上のファイルに転送します。しかし、write()との違いは、どれだけの情報が格納されたかの情報も返しますが、flush()はすぐにこのタスクを実行します。あれは正しいですか? どのような場合に、flush()にwrite()を適用するのが好ましいでしょうか?

+2

しかし、 'flush'は引数をとりません...それらは全く同じではありません。コピーしたドキュメントには 'write'の引数があり、' flush'の引数はありません。 'flush'は' write'を使って書き込まれたデータを強制的にメディアにダンプします。 –

+0

両方の機能を試しましたか?彼らは別のことをすることが明らかになるはずです。 – mkrieger1

+0

'write()'は、プログラムからのデータをIOサブシステムに送ります.IOサブシステムにバッファリングされます。 'flush()'は、バッファされたデータをコミットすることをIOサブシステムに指示します。 –

答えて

2

[Stephen RauchとPeter Woodのコメントも参照してください]もう一方の端でそのストリームから読み込んでいるものに接続されているストリームのコンテキストで考えてみましょう。

write(b)は、あなたの最後にそのストリームのバッファにbを与えます。実際には、これらのバイトをすべてストリームに入れて、ストリームの下端を読者に「送る」ようにすることもできます。

一方、flush()はストリームのバッファにあるすべてのデータを受け取り、それを読み取り器に '送信'します。

基本的には、データをストリームにロードするためにwrite(b)を使用し、最後にflush()を使用して、すべてが実際に基礎ストリームに流れて、送信されたことを確認しますストリームのバッファーに座っている。

たとえば、PySerialパッケージ(実際にストリームとして動作するシリアル接続を作成する)を使用してコンピュータを別のデバイスに接続した場合、そのストリームにデータを入れるために、write )。しかし、すべてのデータがシリアル接続経由で他のデバイスに送信されていることを確認するために、私はflush()を呼び出します。これは、write(b)がそのデータのすべて(または実際には)が実際に他のデバイスに実際に送信されることを保証しないためです。

関連する問題