0

ファイルのアップロードの進行状況を大まかに監視したいと思います。MultipartEntityをオーバーライドして、writeTo(OutputStream out)メソッドを、デフォルトのInputStreamをラップするために作成したFilterOutputStreamクラスに書き込むことができることを知っています。私がそれをどのように行ったかの詳細については、ここで私の答えを参照してください。

ただし、詳しく調べると、これは2回送信されたすべてのバイトをカウントします。ドキュメントにアクセスして、何が起きているかを確認しました。FilterOutputStreamのwrite(byte []、int、int)メソッドは、単にFilterOutputStreamのwrite(byte)メソッドをループで呼び出すように見えます。より効率的なメソッドを提供するためにサブクラスをお勧めします。これには、基になるOutputStreamのwrite(byte []、int、int)を呼び出し、基になるOutputStreamがバイトをストリームにプッシュするより良いメソッドを持っていることを期待することが含まれると思います(出力ストリームのドキュメントの推奨サブクラスはこのメソッドをオーバーライドし、より良い仕事をします単にOutputStream#write(byte)メソッドをループするよりも)。

これは私が窮地に陥っているところです。MultipartEntity#writeTo(OutputStream)が常にOutputStream.write(byte []、int、int)の呼び出しになることを保証することはできません。したがって、そこに送信されたバイトを数えると、を使用して送信されたバイトを見逃す可能性があります。 write(byte)メソッド。ただし、OutputStream.write(byte []、int、int)メソッドがwrite(byte)メソッドを呼び出さない可能性があるため、write(byte)メソッドではカウントできません。

1つの答えは、サブクラスのwrite(byte []、int、int)メソッド内でsuper.write(byte []、int、int)を呼び出すことです。次に、これはwrite(byte)メソッドをループして、一度に1バイトずつ書き込むことを知っています。次に、write(byte)メソッド内に書き込まれたすべてのバイトをカウントできます。ただし、これは非効率的であり、ドキュメントはこれに対して直接推奨しています。OutputStreamのサブクラスのいくつかは、一度に複数のバイトをストリームに書き込むことができると確信しているので、その利点を使用しないのはばかげています。

では、FilterOutputStreamを適切にオーバーライドして、効率的であり、送信されたすべてのバイトをカウントするにはどうすればよいですか?

これが長い場合は申し訳ありませんが、誰かが私よりも問題をうまく説明できるように、私はそれをwikiにしました。

4

1 に答える 1

3

write(byte[] b, int off, int len)カウントストリームで同じメソッドが呼び出されたときに、基になるストリームを呼び出すだけです。これによりwrite(byte b)、カウントストリームのメソッドが呼び出されることはありません。

また、CountingOutputStreamリンクされた回答には他にも多くの問題があります。

  1. ラップされた出力ストリームへの独自の参照がありますが、それは。FilterOutputStreamと呼ばれる保護されたフィールドに格納されますout
  2. lenが呼び出されると、ラップされたストリームにバイトが書き込まれますがwrite(byte[] b, int off, int len)、転送されるバイト数に1が加算されるだけです。
  3. で転送されたバイトはインクリメントされませんwrite(byte b)
于 2010-07-02T04:29:29.080 に答える