4

次のコードフラグメントがあると仮定します。

operation1();
bw.close();
operation2();

コードから呼び出すときはBufferedReader.close()、JVMがシステムコールを実行して、バッファーがフラッシュされてディスクに書き込まれたことを確認すると想定しています。システムコールが動作を完了するのを待つのか、それとも終了するのを待たずclose()に進むのかを知りたい。operation2()close()

私の質問を言い換えると、私がそうするとき、私はそれが正常に完了したoperation2()と仮定できますか?bw.close()

4

8 に答える 8

5

operation2()を実行するとき、bw.close()が正常に完了したと想定できますか?

はい

于 2010-06-02T18:30:01.473 に答える
4

ストリームを閉じて、最初にフラッシュします。ストリームが閉じられると、さらにwrite()またはflush()を呼び出すと、IOExceptionがスローされます。ただし、以前に閉じられたストリームを閉じても効果はありません。

ドキュメントには具体的なことは何も書かれていませんが、この呼び出しは終了するまでブロックされると思います。java.io実際、パッケージにはブロックされていないものはないと確信しています。

于 2010-06-02T18:28:56.107 に答える
4

のJavaDocは、java.io.BufferedReader.close()が満たされている場合、コントラクトから正確に取得されjava.io.Readerます。

Docは言う:

ストリームを閉じて、それに関連付けられているシステムリソースを解放します。ストリームが閉じられると、さらにread()、ready()、mark()、reset()、またはskip()を呼び出すと、IOExceptionがスローされます。以前に閉じたストリームを閉じても効果はありません。

これは、ファイルシステムが完了するまでブロックを明示的に主張しませんが、BufferedReader他のすべての操作のこの同じインスタンスでは、が返された場合に例外がスローされclose()ます。JavaDocは、操作がいつ完了するかについてあいまいに見える可能性がありますが、このメソッドが返されたときにファイルシステムのフラッシュとクローズが完了しなかった場合、コントラクトの精神に違反し、Java(実装またはドキュメント)のバグになります。

于 2010-06-02T18:35:59.977 に答える
2

いいえ!次の理由で確信が持てません。

BufferedWriterは、別のライターのラッパーです。BufferedWriterへのclose()は、基礎となるWriterに伝播するだけです。

この基になるライターがOutputStreamWriterであり、OutputStreamがFileOutputStreamである場合、closeはシステムコールを発行してファイルハンドルを閉じます。

close()がnoopである場合、またはcloseが非ブロッキングで実装されている場合でも、Writerを自由に使用できますが、java.ioのクラスのみを使用する場合、これは当てはまりません。

于 2010-06-02T18:38:27.450 に答える
1

WriterまたはBufferedWriter)は、必ずしもディスクにではなく、どこかに文字のストリームを書き込むブラックボックスです。mustの呼び出しは、 (メソッドコントラクトによって)閉じる前にバッファリングされたコンテンツをフラッシュし、通常は)すべての「必須」作業が完了する前にブロックする必要があります。ただし、これは実装と環境によって異なります(たとえば、Javaレイヤーの下にあるキャッシュについて知ることはできません)。Javaライター自体によって実行される作業のどの点で(たとえば、FileWriterなどの場合は、システムコールを実行してディスクに書き込み、ファイルハンドルを閉じます)、はい、それを返すと想定できます。すでにすべての作業を行っています。close() close()

于 2010-06-02T18:34:12.813 に答える
1

write()一般に、どのI / O操作でも、操作が完了した後でも、何が起こったのかを推測することはできませんclose。のアイデアはdelivery、媒体に関連する主観的な概念です。

たとえば、writerがTCP接続を表し、クライアントとサーバーの間でデータが失われた場合はどうなりますか?または、カーネルがデータをディスクに書き込んでも、ドライブが物理的にデータを書き込めない場合はどうなりますか?または、作家が途中で撃たれる伝書鳩を代表している場合はどうなりますか?

さらに、書き込みにエンドポイントがデータを受信したことを確認する方法がない場合を想像してください(読み取り:udp / datagrams)。その状況でのブロッキングポリシーはどうあるべきですか?

于 2010-06-02T18:47:46.123 に答える
1

バッファがオペレーティングシステムにフラッシュされ、ファイルハンドルが閉じられるため、必要なJava操作が完了します。

ただし、オペレーティングシステムは、実際のディスク、パイプ、ネットワークなどへの書き込みをキャッシュまたはキューに入れます。物理的な書き込みが完了したという保証はありません。FileChannel.force()は、ローカルディスク上のファイルに対してこれを行う方法を提供します。Javadocを参照してください。

于 2010-06-03T00:05:38.077 に答える
0

はい、到達した場合operation2();、ストリームは完全に閉じられている必要があります。ただし、、close() throws IOExceptionなので、に到達しない場合もありますoperation2();。これは、期待する動作である場合とそうでない場合があります。

于 2010-06-02T18:30:28.227 に答える