5

java.io.EOFException が表示される理由がわかりません。サーバーからバイナリストリームを取得した後にファイルを書き込みたいです。

これが私のコードです

inputStream = new DataInputStream(new BufferedInputStream(connection.getInputStream()));
FileOutputStream fos = new FileOutputStream("D:/Apendo API resumable download.txt");

byte b = inputStream.readByte();
while(b != -1){
        fos.write(b);
        b = inputStream.readByte();                       
       }
fos.close();

スタックトレース

java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:267)
at HttpRequestJSON.JSONRequest.sendRequest(JSONRequest.java:64)
at HttpRequestJSON.Main.main(Main.java:56)
4

4 に答える 4

11

DataInputStream.readByte API は、EOS で -1 を返すとは言っていません。

戻り値: この入力ストリームの次のバイト (符号付き 8 ビット バイト)。

例外: EOFException - この入力ストリームが最後に達した場合。

DataInputStream.readByte を操作するときに、ストリームに残っているバイト数がわかっていると想定しています。それ以外の場合は、EOFException を EOS の指標として使用できます。

ところで、 read() を使用すると、EOFException なしで EOS で -1 が返されます

于 2013-07-10T07:21:02.020 に答える
1

DataInputStreamJavadocから:

データ入力ストリームを使用すると、アプリケーションは、基になる入力ストリームからプリミティブな Java データ型をマシンに依存しない方法で読み取ることができます。

それが必要かどうかはわかりませんが、自分で決めることができます。一般に、データをダウンロードしてファイルに書き込むだけであれば、それは必要ありませんBufferedInputStream

このreadByte()メソッドは 1 バイト (名前の由来) をEOFException読み取り、すべてのバイトを読み取る前にストリームが最後に到達すると をスローします。少し混乱するかもしれませんが、ファイルの書き込みではなく、入力の読み取りで例外がスローされます。実際、これがDataInputStreamが終了したかどうかを判断する唯一の方法です。

しかし、もう一度、 だけを使用することを検討してBufferedInputStreamください。おそらくそれで十分です。

于 2013-07-10T07:22:50.020 に答える
0

クライアントとサーバーの実装をいつ使用するかによって異なります。クライアントは「常に稼働」しており、ソケットは常に維持されています。

ソケット接続が確立されていて、たとえば ObjectInputStream を使用すると、クライアントがソケット (socket.close) を閉じるときに「EOFException」が表示されるか、socket.close() が最後にチェックされないときに「java.net.SocketException: Connection」リセットが表示されます。承知しました...

ただし、クライアントとソケットの接続を維持すると、 ObjectInputStream.readObject() はそのまま残り、このシナリオで必要なものをリッスンします。はい、read() のみを呼び出すと -1 が返され、クライアントが強制終了され、サーバーで 1 つのクライアントに対して 1 つのスレッドを処理している場合、-1 のみが取得され、スレッドは永遠に存続します (手動で強制終了または強制終了しない場合)サーバー全体)

于 2015-04-12T10:26:57.100 に答える
0

あなたはすでにそのバイトを読んだのに、なぜ再びそれを読んでいるのですか? さらに、while でのチェックが正しくないため、DIS.readByte に対して -1 を取得できません。read() を使用してみてください。

于 2013-07-10T07:35:07.460 に答える