web-dev-qa-db-ja.com

JavaのストリームでEOFExceptionが発生するのはいつですか

DataInputStreamを使用していて、EOFExceptionsについて質問がありました。

Javaドキュメントによると:

入力中にファイルの終わりまたはストリームの終わりに予期せず到達したことを通知します。

この例外は主に、ストリームの終了を通知するためにデータ入力ストリームによって使用されます。他の多くの入力操作は、例外をスローするのではなく、ストリームの終わりに特別な値を返すことに注意してください。

これは、EOFExceptionが生成されたときに、ストリームが二度と開かないことを意味しますか?これ以上のデータを期待してはいけないということですか?

出力ストリームが入力ストリームに接続され、outputstream.close()が呼び出された場合、入力ストリームはEOFExceptionまたはIOExceptionを受け取りますか?

IOExceptionは次のように説明されます。

ある種のI/O例外が発生したことを通知します。このクラスは、I/O操作の失敗または中断によって生成される例外の一般的なクラスです。

出力ストリームを閉じると、データ入力ストリーム側でEOFExceptionまたはIOExceptionが発生しますか?

16
jbu

キーワードは意外です。

DataInputStreamを使用して4バイトの整数を読み取ったが、ストリームに残っているバイトが3バイトしかない場合は、EOFExceptionが発生します。

ただし、ストリームの最後でread()を呼び出すと、-1が返され、例外はありません。

7
Pyrolistical

ストリームの終わりに到達したとき(ファイルの終わり、またはピアが接続を閉じたとき):

  • read()は-1を返します
  • readLine()はnullを返します
  • 他のXスローの場合はreadXXX()EOFExceptionをスローします。

ストリームはまだ開いていますが、ストリームからの読み取りを停止して閉じる必要があります。

7
user207421

質問の別の部分に答える:はい、EOFは、ストリームにこれ以上データが表示されないことを意味します。ストリームを閉じる必要があります。

4
Dan Breslau

EOFExceptionは、IOExceptionのサブクラスです。ストリームから読み取ろうとして、読み取るデータがなくなった場合にスローされます(たとえば、DataInputStreamがFileInputStreamにラップされていて、ファイルに残っているよりも多くのバイトを読み取ろうとしているため)。

3
Simon Nickerson

EOFExceptionがスローされます:

  1. [〜#〜] stream [〜#〜]にデータがないが、読み取ろうとしている場合...たとえば、DataInputStream、ObjectInputStream、RandomAccessFileなどのチェーンストリームの読み取りメソッドは、EOFExceptionをスローします。 FileInputStreamから読み取ろうとしていますが、FileInputStreamが空です
  2. または、形式が一致しない場合...たとえば、intが存在し、DataInputStreamのreadFloat()を使用している場合
0
Saili Waichal