30

メソッドは、java.io.InputStream.close()をスローするように宣言されていIOExceptionます。そのような例外が実際にスローされるのはどのような状況ですか?

編集: はい、javadoc を読みました。「I/Oエラーが発生したとき」よりも具体的な人はいますか? を閉じるときに発生する可能性のある I/O エラーはInputStreamですか?

4

4 に答える 4

21

ファイル システムからの入力ストリームの読み取りの場合、ファイル システム自体がファイルの最終アクセス時刻のメタデータまたはその他のメタデータを閉じるときに更新しているときに、エラーが発生する可能性があります。とにかく、これは実際にはほとんど起こりません。

ネットワーク接続から読み取る入力ストリームの場合、クローズ時のエラーはもう少し考えられます。ネットワーク ソケットの通常の閉鎖には、実際には接続を介して送信される閉鎖要求 (TCP/IP FIN パケット) が含まれ、相手側がこの閉鎖要求を確認するのを待ちます。(実際には、接続のもう一方の端が順番に閉鎖要求を送信し、閉鎖側がそれを確認します。) したがって、ソケット入力ストリームの場合、閉鎖操作には実際には接続を介してトラフィックを送信することが含まれ、閉鎖はこうして次のことができます。エラーで失敗します。

多くの実装では、通常、ストリームが既に閉じられてclose()いる場合は をスローしないことに注意してください。ストリームを再び閉じるのに黙って失敗IOExceptionするだけです。

于 2013-05-04T00:49:02.400 に答える
5

Java ソース コードを調べていると、そのIOException理由を示す興味深いものが見つかりました。InputStream 抽象クラスです。したがって、閉じられる入力の種類を予測することはできないため、情報の流れを維持することをお勧めします。

IOException入力ストリームのクローズに失敗する可能性があるため、その入力ストリームを使用するコードはすべて をスローできる必要があります。失敗した場合、処理が必要になる可能性が高いため、実装を使用しているものは何でもそれについて知る必要があります。

Java の例外構造のレイアウトを理解することは重要です。もちろん、すべての例外は extendsExceptionです。ただし、より広いカテゴリの例外もあります。java.lang.IOExceptionこれらの 1 つであり、考えられるすべての入出力例外をカバーしています。I/O エラーが発生したと言うときは、 に該当するものすべてを参照していますIOException。その結果、多くの例外がこれを拡張します (例: FileNotFoundExceptionEOFExceptionなど)。これらを管理するには、広範で包括的な例外を用意することが重要です。

その結果、すべての IO クラスは、クローズ時にさまざまな IOExceptions のいずれかをスローできる必要があります。close()したがって、スローする必要がありますIOException-これにより、その実装は拡張機能のいずれかをスローすることもできIOExceptionます。close()これがスロー- 例外が継承される理由IOExceptionであり、ストリームを閉じるときに IOExceptions のいずれかを実行できる必要があります。


注目すべきいくつかのシナリオを次に示します。

  • IOStream を 2 回閉じることはできませんが、通常は例外をスローしません。
  • コンテンツにアクセスできなくなります (ディスクがアンマウントされたなど) (close()ファイルがビジー状態でなくなったことを示すインジケーターが必要なため、これは実際にはオペレーティング システムにとって重要です)
  • 汎用ソースは終了しました
  • の他のすべてのサブクラスでカバーされない一般的な障害IOException(例: FileNotFoundException)

IOExceptionを実行して原因を確認できますException.getMessage()

于 2013-05-04T00:49:49.340 に答える
4

基礎となる close システム コールは最終的に行う必要があります (例: Linux http://linux.die.net/man/2/close ) 。その呼び出しは、EIO「I/O エラーが発生しました」で失敗することが文書化されています。その理由は、基になるファイル システムcloseコールが失敗する可能性があるためです。

于 2013-05-04T01:33:38.993 に答える
1

私はこれについて自分自身で疑問に思っており、数年前にこのトピックについて少し調査しました. これは私が知っていることです....

あなたが提供したリンクのjavadocを見ると、「InputStreamのcloseメソッドは何もしません」と明確に述べられているので、例外をスローする方法はありませんよね?しかし、IOException のすべてのサブクラスを見ると、inputstream のサブクラスがストリームを閉じることができない状況が数多くあることがわかります。したがって、この例外はサブクラスがそれを利用できるように設計されていると思います。

http://docs.oracle.com/javase/6/docs/api/java/io/IOException.html

場合によっては迷惑にすぎない場合もあれば、何かがうまくいかなかったことを明確に示している場合もあります。それはすべて、使用している入力ストリーム実装のタイプによって異なります。

于 2013-05-04T00:50:20.033 に答える