InputStream.bytesRemaining小于应该

时间:2011-02-02 14:32:35

标签: java android

我有来自十几个来源的一堆图像,我正在后台线程下载它们。大多数图像都是在没有问题的情况下下载的,但有2个源会导致问题。他们的所有图像都无法加载。

我使用以下代码下载(和存储)图片:

File f=new File(cacheDir, urlHash);
Bitmap bitmap=null;
InputStream is=new URL(url).openStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = BitmapFactory.decodeStream(new FileInputStream(f), null, null);

Utils.CopyStream:

public static void CopyStream(InputStream is, OutputStream os)
{
    int counter = 0;
    final int buffer_size=1024;
    try
    {
        byte[] bytes=new byte[buffer_size];
        for(;;)
        {
          int count=is.read(bytes, 0, buffer_size);
          if(count==-1) {
              Log.d("tag", counter + " bytes copied");
              break;
          }
          os.write(bytes, 0, count);
          counter += count;
        }
    }
    catch(Exception ex) {
        ex.printStackTrace();
    }
}

当我尝试下载此图片http://www.zapakatel.cz/static/deal/7193-1057b.jpg而不是失败时。 BitmapFactory.decodeStream返回NULL。所有我能找到的可能导致问题的是is.bytesRemaining缺少几千字节:162721 vs 179845根据下载的文件大小。当我从该URL手动下载图像并将其上传到其他地方时,一切正常。

知道什么可能导致问题吗?托管此图像的服务器是否有可能在下载完成之前将我切断?这个图像在任何PC甚至在我的iPhone应用程序中加载都很好(我知道这是完全不同的平台,它可能并不重要,我只觉得它很奇怪)

1 个答案:

答案 0 :(得分:6)

我对Android没有任何经验,但这个问题似乎与响应的GZIP编码有关。

您指向的文件将返回并应用GZIP编码。 162721字节是编码数据的大小,179845是解码后的大小,您可以使用任何HTTP检查器进行检查。看起来new URL(url).openStream()不会自动解码GZIP编码的响应。