Marsss
2017-12-21 11:05:59 +08:00
野生码畜爬坑小记:
又花了一天的时间来爬这个坑,暂时算是爬出来了。把一些东西写在这里,也许会有人需要参考。
首先,我图中的代码不严谨:
response.append(new String(b)) 这里由于 read(b)函数的特性,并不能保证每次都能填满 b 这个字节组,如果在某次循环中,read(b)只更新了 b 的一部分值,另外一部分值则还保留了上一次的值,这样 append 到 response 里,会出现问题。
那么我们应该读到多少就 append 多少才行,改成这样:
response.append(new String(b,0,len, charset))
然而这个优化并没有解决我遇到的问题,我的程序在 debug 的时候依然还是只能读到一部分数据就跳异常了,我突然想到我之前使用的本机的浏览器测试访问正常的,那么直接使用模拟器的浏览器去访问呢,结果让我很意外,genymotion 模拟器自带的浏览器竟然也只读取到了一部分值,这 TM 至少说明了,也许我的代码并没有什么大毛病,可能是环境引起的问题。
于是我在网上随便下载了一个雷电模拟器,用它自带的浏览器能正常获取到数据。于是直接使用这个雷电模拟器来 debug,这次终于正常了。。。看来被各种推荐的神器 genymotion 在 win 环境下也是可能存在一些问题的啊,MD,折腾了好几天了。
另外,我觉得我这个帖子的问题可能问的有点不对,我其实并不需要知道怎么去用 httpurlconnection 读取一个较大的数据,不过我在搜索资料的过程中,可能对这个问题有一些思路,也顺便写在这里吧。
我们其实可以在我们的服务端的 response 里面加一个 Accept-Ranges: bytes 栏,这样客户端就可以使用多线程分段请求的方式来读取这个大文件了,既解决了数据过大引起的读取差错,又提高了读取效率。详见 http 协议。
看来还是不能太浮躁,心想着用了几天 python,Java 看都不看,撸起袖子就抄代码,终究还是要吃亏。
就这样吧,谢谢各位。