【问题标题】:URL - InputStream.available() less than URLConnection.getContentLength() why?URL - InputStream.available() 小于 URLConnection.getContentLength() 为什么?
【发布时间】:2018-04-01 12:59:10
【问题描述】:

我从 URL 读取图像,如下所示:

URL url = new URL("http://link-to-image");

然后我想校验它的内容,所以我需要 InputStream.mark() 方法。但是当我调用 reset() 时,我得到了带有消息“重置为无效标记”的 IOException

图片大小为82.271KB,有一点奇怪:

URLConnection con = url.openConnection();
con.getContentLength(); // value is 84246, correct
InputStream is = con.getInputStream();
is.available(); // value is 73203, incorrect

我可以调用reset()成功使用标记(84246 + 1),为什么InputStream返回错误值?

PS:如果 InputStream from File,available() 是对的。

【问题讨论】:

  • "is.available(); // 值为 73203,不正确",不只是阅读 javadocs,它只是对可能内容的估计,而不是实际长度。您应该首先检查该流实现是否支持标记。流在关闭之前没有长度,如果没有关闭,它们仍然可以增长。
  • The documentation for InputStream.available() 对此非常清楚。在任何情况下,您都不应依赖它来返回可以读取的总字节数。

标签: java url io inputstream


【解决方案1】:

这是来自 java 文档:

public long getContentLengthLong()

Returns the value of the content-length header field as a long.

因此,如果它是一个文件,则您没有标头并且它们匹配,但是当您使用数据本身进行流以外的 http 连接时,它会携带许多其他信息(标头),这就是数字不匹配的原因.

【讨论】:

  • so,意思是我不能通过http连接流的InputStram.avaliable方法得到正确的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2011-04-11
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多