我想知道响应某个http请求发送了多少数据。 我现在所做的是:
HttpURLConnection con = (HttpURLConnection) feedurl.openConnection();
//检查内容大小的响应 int feedsize = con.getContentLength();
问题是,内容-thongnth并不总是设置。例如。当服务器使用transfer-encoding = chunked时,我得到一个值-1。
我不需要它来显示进度信息。我只需要知道完成后发送给我的数据的大小。
背景:我需要这些信息,因为我想将它与使用gzip编码发送的响应大小进行比较。
答案 0 :(得分: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);
}
}
答案 1 :(得分:2)
您可以扩展FilterInputStream
,覆盖read()
,read(byte[],int,int)
和skip
方法,以便在调用super
表单后,更新计数器读取的字节数。
然后使用其中一个包装URLConnection
返回的输入流,并使用包装器代替原始流。完成后,您可以查询包装器的计数器。
其他(“手动”)方法将使用YSlow等工具在浏览器中收集统计信息,或使用Wireshark检查网络上的流量。