2

にコピーInputstreamするとOutputStream、 が発生することがありEOFExceptionます。

のドキュメントから、EOFExceptionストリームの終了を通知するためにデータ入力ストリームで使用される場合があります。

EOFExceptionでは、が発生したときに戻っても安全だということですか?

public static void copy(InputStream in, OutputStream out) throws IOException {

byte[] buff = new byte[BUF_SIZE];
int n = -1;

try {
  while ((n = in.read(buff)) >= 0) {
    out.write(buff, 0, n);
  }
} catch (EOFException eof) {
  // reach EOF , return
}

}

4

3 に答える 3

2

InputStream.read(byte[]) で EOFException をスローすることはできません。その API は、「ファイルの末尾以外の理由で最初のバイトを読み取れない場合...」に IOException がスローされることを示しています。

EOFException は、他の目的で使用されます。java.io.DataInputStream.readFully(byte[] b) は、すべてのバイトを読み取る前に入力ストリームが最後に到達した場合、EOFException をスローすることがあります。

ただし、いずれにせよ、EOFException はエラーが発生したことを示します。これを無視して、何も起こらなかったかのように返す必要はありません。

于 2012-12-20T11:50:14.343 に答える
0

InputStream.read(byte[])に読み込める限り多くのバイトを埋めようとするだけで、 EOF に達するbyte[]と戻ります。-1そのEOFExceptionため、通常は投げられません。EOFException予期せぬ事態に投げ出されます。したがって、ロジック自体に何か問題があることを意味するため、理想的には、この例外をキャッチするのではなく、単にスローする必要があります。

InputStream.read(byte[]) == -1EOF をチェックするために使用する必要があります。例外はコストがかかるため、例外を使用してストリームの終わりに到達したかどうかを判断することはお勧めできません。

于 2012-12-20T11:53:36.837 に答える
0

から正しく読み取った場合InputStream、この例外はスローされません。データがなくなると、ファイルの終わりに到達することが予想されます。への最後の呼び出しreadが返さ-1れ、それ以降のすべての呼び出しreadで例外がスローされます。例外をキャッチしたときに値を返すことは安全ですが、エラーを完全に回避する必要があります。このようなことをする必要があります:

public static void copy(InputStream in, OutputStream out) throws IOException {

  byte[] buff = new byte[BUF_SIZE];
  int n = -1;

  try {
    while ((n = in.read(buff)) != -1) { //See the JavaDoc
      out.write(buff, 0, n);
  }
  catch (IOException eof) {
     e.printStackTrace(); //So you know if something happens...
  }
}

ちなみに、このメソッドは...ではなくreadをスローします。IOExceptionEOFException

于 2012-12-20T11:47:10.673 に答える