2009-11-04 11 views
5

特定のhttp-requestに応答してどれくらいのデータが送信されたかを知りたいと思います。 私が現在やっていることはこれです:JavaのHTTPレスポンスのサイズを取得

HttpURLConnection con = (HttpURLConnection) feedurl.openConnection(); 

//コンテンツサイズ int型feedsize = con.getContentLength()の応答を確認してください。

問題は、content-legnthが必ずしも設定されていないことです。例えば。サーバーがtransfer-encoding = chunkedを使用すると、-1の値が返されます。

私はではないは進捗情報を表示するためにこれを必要とします。私はそれが完了した後私に送られたデータのサイズを知る必要があります。

背景:この情報は、gzipエンコーディングを使用して送信されたレスポンスのサイズと比較したいので、この情報が必要です。 superフォームを呼び出した後、彼らは読み込んだバイト数でカウンタを更新するよう

答えて

8

私はcommons-io CountingInputStreamを使用していますが、それはあなたの仕事です。完全ではあるが例:

public long countContent(URL feedurl) { 
    CountingInputStream counter = null; 
    try { 
    HttpURLConnection con = (HttpURLConnection) feedurl.openConnection(); 
    counter = new CountingInputStream(con.getInputStream()); 
    String output = IOUtils.toString(counter); 
    return counter.getByteCount(); 
    } catch (IOException ex) { 
    throw new RuntimeException(ex); 
    } finally { 
    IOUtils.closeQuietly(counter); 
    } 
} 
+0

ありがとう、それは私が必要としたものです。そして、もう1つの依存関係は怪我をしません;-) – er4z0r

2

あなたがread()read(byte[],int,int)、およびskipメソッドをオーバーライドし、FilterInputStream拡張することができます。

次に、URLConnectionによって返された入力ストリームをこれらの1つでラップし、元のストリームの代わりにラッパーを使用します。完了したら、ラッパーのカウンターに問い合わせることができます。

他の( "マニュアル")アプローチは、YSlowのようなツールを使ってブラウザで統計を収集するか、Wiresharkを使ってネットワーク上のトラフィックを調べることです。

+0

返信いただきありがとうございます!私は非常に良い、非常に怠惰なコーダーではないことを認めなければならない。私は自分の車輪/ハックを発明するのが好きではありません。間違いを避け、時間を節約するために、Commons-ioのCountingInputStreamを既存のソリューションとして使用します。 お返事ありがとうございます。 – er4z0r

関連する問題