5

我想知道响应某个 http 请求发送了多少数据。我目前做的是这样的:

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

//检查内容大小的响应 int feedsize = con.getContentLength();

问题是,内容长度并不总是设置。例如,当服务器使用 transfer-encoding=chunked 我得到一个值 -1。

不需要它来显示进度信息。我只需要知道完成后发送给我的数据的大小。

背景:我需要此信息,因为我想将其与使用 gzip 编码发送的响应的大小进行比较。

4

2 回答 2

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);
  }
}
于 2009-11-04T14:43:02.637 回答
2

您可以扩展FilterInputStream、覆盖read()read(byte[],int,int)skip方法,以便在调用super表单后,它们会使用读取的字节数更新计数器。

然后用其中之一包装返回的输入流URLConnection,并使用包装器代替原始流。完成后,您可以查询包装器的计数器。

其他(“手动”)方法将使用 YSlow 之类的工具在浏览器中收集统计信息,或使用 Wireshark 来检查网络上的流量。

于 2009-11-04T14:42:05.777 回答