关于HttpURLConnection获取图片不全的原因:
- 每次使用流读取本地文件的时候,我总喜欢使用使用如下代码,用起来超级爽。
FileInputStream input = new FileInputStream(new File("abc.txt"));
byte []b = new byte[input.available()];
input.read(b);
然而,这样的方法固然是简单的,但是,在今天写项目这样写却让我遇到了一个 玄学问题…至于为什么说他玄学,是因为,代码的效果时而好时而又出问题,简单来说,就是我在使用HttpURLConnection
获取一个资源 图片的时候,我还是使用了如上的方法,即:
URL url = new URL(host+param.toString());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true); // 设置该连接是可以输出的
connection.setDoInput(true); //设置可以读取
connection.setUseCaches(false);
connection.setRequestMethod("POST"); // 设置请求方式
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){
InputStream input = connection.getInputStream();
byte []b = new byte[input.available()];
input.read(b);
}
使用上面的方法,我发现了一个问题,然后把图片显示到网页中,但是我发现图片效果总是不全,不是缺一点就是缺一半,最后我检查了一下接收图片的字节大小,图片本来的的大小是36840
个字节,但是我用HttpURLConnection
获取过来的字节竟然才是8000
多个字节。我百思不得其解?为什么?然后我又换了一种写法:
-
if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){ InputStream input = connection.getInputStream(); byte []b = new byte[5*1024*1024]; int len = 0,len2 = 0; while((len=input.available())!=0){ input.read(b,len2,len); len2 = len+len2; } }
这样的写法有什么作用?我想着是 循环,如果可读字节不是零的话,就一直读,然而,还是不行。我真的很无语?有时候真的想放弃了,因为我们遇到的问题太奇葩了,网上搜的大多都是牛头不对马嘴,但我还是坚持不懈的去探索,终于发现了问题的所在。
一旦我们使用了网络通信,即就是我是用的HttpURLConnection
,在网络不稳定的情况下,input.available()
的值就是0了。所以这个时候我们就不能懒了,不能使用这种方式,这种方式只适用于我们读本地的文件。最终的解决方案就是如果流的字符不为-1,即下面的这段代码:
-
InputStream inputStream = connection.getInputStream(); ByteArrayOutputStream data = new ByteArrayOutputStream(); //设置接收附件最大10MB byte [] fileByte = new byte[10*1024*1024]; int len =0; while((len=inputStream.read(fileByte))!=-1) { data.write(fileByte,0,len); }
完美解决,血的教训。。