`
chshevo
  • 浏览: 9379 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Android 笔记22 :I/O~文件下载,SDCard文件读、写(转)

阅读更多
原文链接:http://snmoney.blog.163.com/blog/static/440058201010222342599/

这里开始,有点让我这个菜鸟晕乎... 上午我甚至还没搞清楚 InputStream 是什么,和 OutputStream 有什么不同..


其实现在还没完全懂,emmm 先说个大概吧 字面意思理解了...数据流,是的


简单地说我想从网上下载个文件,然后保存到SDCard里,那么遵循的是下面这个大概的步骤。可以理解成从一个大水罐A里取水存到另一个空水罐B里


1. 要知道确切地 uri
2. 建立 HttpUrlConnection(还有URL.getContent等办法,不逐一列举),然后这里可以做一些确保工作之类的~~例如检测返回的状态码确保网络连通,目标文件不会404或者500之类
3. 可以 getInputStream , 于是得到一个is =  InputStream //找到装满水的罐子A了,嘿
4. 然后~ 弄个 byte[] b, 用来做数据的搬运工具,  InputStream.read(b) 这样读出来 //b就是杯子
5. 在同一时间创建一个 File f =new File(..路径..文件名) 还有 os = OutputStream(f) <-----留意这里,时间关系~我让outputstream 和f勾搭上了 //这是空罐子B
6. 开始 os.write(b)  //水从A罐向B了
*7. 完成后可以很好习惯地 is.close(); os.close(); //把两个罐子的盖子盖上~省得被妈妈啰嗦

上面这种方法读小文件是不会有什么问题的,但如果是比较大的文件?尤其是手机上应用~网络很慢会怎样?如果要再贪心一点~想显示下载进度呢?


也就是说如果罐子里的水一杯装不完怎么办?出错了~


在 byte[]这里做做手脚 指定固定的大小,通过循环 read(b), write(b) 的方式就能把流数据切小段读取,但要设计好最后一杯不是满杯的,用write(btye[] b, int start,int count);这个方法能保证不会倒入多余的不明液体~嘿嘿嘿
另外,对http连接获取内容大小,循环的时候知道每杯的容量,每次循环...进度多少也就心里有底了~
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics