【问题标题】:Limitation in Java HttpUrlConnection getting content lengthJava HttpUrlConnection 获取内容长度的限制
【发布时间】:2011-01-18 16:30:35
【问题描述】:

没错,我开始创建一个运行良好的 Java 下载管理器的项目。我目前看到的唯一问题是当我请求 URL 的内容长度时。当我使用 HttpUrlConnection 的 getContentLength 提供的方法时,它返回一个 Int。

如果我只下载文件大小小于 2GB 的文件,那就太好了。进行更多挖掘并发现 java 不支持 unsigned int 值,但即使这样也只会给我一个最大 4GB 的文件大小。

谁能帮助我正确获取大于 2GB 的文件的内容大小。

提前致谢。

更新

感谢您回答精英绅士,我尝试了您的建议,但一直返回空值,所以我所做的是

HttpURLConnection conn = (HttpURLConnection) absoluteUrl.openConnection();
conn.connect();
long contentLength = Long.parseLong(conn.getHeaderField("Content-Length"));

出于某种原因,只使用 conn.getRequestProperty 总是为我返回 null

【问题讨论】:

  • 我正在寻找getHeaderField(...),但找不到。这实际上是最好的方法......我已经更新了我的答案。哦,是的,getRequestProperty 在执行 POST/GET 请求之前使用,即它用于请求而不是响应。

标签: java download httpurlconnection


【解决方案1】:

为什么不尝试使用 headerField 方法来获取内容长度?即

HttpURLConnection connection = new HttpURLConnection(...); 
long contentLength = Long.parseLong(connection.getHeaderField("Content-Length"));

它等同于connection.getContentLength,只是返回值是字符串类型。这可以给出准确的位长结果。

更新:我将其更新为使用 HeaderField 而不是 requestProperty...感谢问题的作者。


感谢 Ru 的 @FlasH,您可以使用 JDK 7 及更高版本获得相同的结果。

这实际上调用了新的 URLConnection.getHeaderFieldLong() 方法,该方法也在 JDK 7 及更高版本中引入。

【讨论】:

  • 顺便说一句,现在有一个 connection.getContentLengthLong 可用(从 Java 7 开始),它与建议的功能相同,但字数更少。
  • 看来这个解决方案也会触发下载。我们如何才能只获取标题而不开始实际下载以节省带宽?
  • 对于那些寻求 Android 等价物的人... API 24 developer.android.com/reference/java/net/… 只需按照答案所示手动获取!
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多