DataInputStreamを使用していて、EOFExceptionsについて質問がありました。
Javaドキュメントによると:
入力中にファイルの終わりまたはストリームの終わりに予期せず到達したことを通知します。
この例外は主に、ストリームの終了を通知するためにデータ入力ストリームによって使用されます。他の多くの入力操作は、例外をスローするのではなく、ストリームの終わりに特別な値を返すことに注意してください。
これは、EOFExceptionが生成されたときに、ストリームが二度と開かないことを意味しますか?これ以上のデータを期待してはいけないということですか?
出力ストリームが入力ストリームに接続され、outputstream.close()が呼び出された場合、入力ストリームはEOFExceptionまたはIOExceptionを受け取りますか?
IOExceptionは次のように説明されます。
ある種のI/O例外が発生したことを通知します。このクラスは、I/O操作の失敗または中断によって生成される例外の一般的なクラスです。
出力ストリームを閉じると、データ入力ストリーム側でEOFExceptionまたはIOExceptionが発生しますか?
キーワードは意外です。
DataInputStreamを使用して4バイトの整数を読み取ったが、ストリームに残っているバイトが3バイトしかない場合は、EOFExceptionが発生します。
ただし、ストリームの最後でread()を呼び出すと、-1が返され、例外はありません。
ストリームの終わりに到達したとき(ファイルの終わり、またはピアが接続を閉じたとき):
read()
は-1を返しますreadLine()
はnullを返しますreadXXX()
はEOFException
をスローします。ストリームはまだ開いていますが、ストリームからの読み取りを停止して閉じる必要があります。
質問の別の部分に答える:はい、EOFは、ストリームにこれ以上データが表示されないことを意味します。ストリームを閉じる必要があります。
EOFExceptionは、IOExceptionのサブクラスです。ストリームから読み取ろうとして、読み取るデータがなくなった場合にスローされます(たとえば、DataInputStreamがFileInputStreamにラップされていて、ファイルに残っているよりも多くのバイトを読み取ろうとしているため)。
EOFExceptionがスローされます: