关于使用HttpURLConnection获取图片不全的原因:

关于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);
    							
    						}
    

完美解决,血的教训。。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值