2009-11-04 113 views
5

我想知道为响应某个http请求而发送了多少数据。 我目前做的是这样的:获取Java中HTTP响应的大小

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

//检查内容尺寸 INT feedsize = con.getContentLength)响应(;

问题是,content-legnth并不总是设置。例如。当服务器使用transfer-encoding = chunked时,我得到-1的值。

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

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

回答

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

谢谢,这正是我需要的。而与maven一个更多的依赖不会伤害;-) – er4z0r 2009-11-04 15:16:30

2

可以扩展FilterInputStream,覆盖read()read(byte[],int,int),并且skip方法,以便调用super形式后,他们更新与读取的字节数的计数器。

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

其他(“手动”)方法将使用像YSlow这样的工具在浏览器中收集统计数据,或使用Wireshark检查网络上的流量。

+0

感谢您的答复!我必须承认,我不是一个很好,也是一个非常懒惰的编码器。我不喜欢为此发明自己的车轮/黑客。所以为了避免错误并节省时间,我将使用commons-io中的CountingInputStream作为已建立的解决方案。 再次感谢您的时间! – er4z0r 2009-11-04 15:15:47