转自 http://blog.csdn.net/zzp_403184692/article/details/8160739

一、文件下载

Android开发中,有时需要从网上下载一些资源以供用户使用,Android API中已经提供了很多直接可以用的类供大家使用,一般文件下载需要通过三个步骤:

1.创建一个HttpURLConnection对象:

[java] view plain copy
  1. //创建一个URL对象,urlStr指的是网络IP地址
  2. url=newURL(urlStr);
  3. //创建一个HttpURLConnection连接
  4. HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();

2.获得一个InputStream对象:

[java] view plain copy
  1. InputStreaminput=null;
  2. input=urlConn.getInputStream();

3.设置访问网络的权限:

[java] view plain copy
  1. //在AndroidManifest.xml配置文件中加入权限信息
  2. <uses-permissionandroid:name="android.permission.INTERNET"/>

二、访问并写入SD卡

由于手机内存有限,所以一般需要将资料放入大容量容器SD卡中,不同手机SD卡所在目录不一样,这就需要咱们通过一个统一的函数找到SD卡所在的目录,再对它进行操作,Android中提供了一个函数,可以查找到基本上所有类型型号的手机SD卡所在的目录:

[java] view plain copy
  1. //得到当前设备SD卡的目录
  2. Environment.getExternalStorageDirectory();

在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:

[java] view plain copy
  1. //在AndroidManifest.xml配置文件中加入权限信息
  2. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用:

[java] view plain copy
  1. publicclassFileUtils{
  2. privateStringSDPATH;
  3. publicStringgetSDPATH(){
  4. returnSDPATH;
  5. }
  6. publicFileUtils(){
  7. //得到当前外部存储设备的目录
  8. ///SDCARD
  9. SDPATH=Environment.getExternalStorageDirectory()+"/";
  10. }
  11. /**
  12. *在SD卡上创建文件
  13. *
  14. *@throwsIOException
  15. */
  16. publicFilecreatSDFile(StringfileName)throwsIOException{
  17. Filefile=newFile(SDPATH+fileName);
  18. file.createNewFile();
  19. returnfile;
  20. }
  21. /**
  22. *在SD卡上创建目录
  23. *
  24. *@paramdirName
  25. */
  26. publicFilecreatSDDir(StringdirName){
  27. Filedir=newFile(SDPATH+dirName);
  28. dir.mkdir();
  29. returndir;
  30. }
  31. /**
  32. *判断SD卡上的文件夹是否存在
  33. */
  34. publicbooleanisFileExist(StringfileName){
  35. Filefile=newFile(SDPATH+fileName);
  36. returnfile.exists();
  37. }
  38. /**
  39. *将一个InputStream里面的数据写入到SD卡中
  40. */
  41. publicFilewrite2SDFromInput(Stringpath,StringfileName,InputStreaminput){
  42. Filefile=null;
  43. OutputStreamoutput=null;
  44. try{
  45. creatSDDir(path);
  46. file=creatSDFile(path+fileName);
  47. output=newFileOutputStream(file);
  48. bytebuffer[]=newbyte[4*1024];
  49. while((input.read(buffer))!=-1){
  50. output.write(buffer);
  51. }
  52. output.flush();
  53. }
  54. catch(Exceptione){
  55. e.printStackTrace();
  56. }
  57. finally{
  58. try{
  59. output.close();
  60. }
  61. catch(Exceptione){
  62. e.printStackTrace();
  63. }
  64. }
  65. returnfile;
  66. }
  67. }


三、实例演示

在对以上文件下载和SD卡访问基本知识了解的基础上,下面进行举例说明:

文件下载一般有文本文件和字节文件,不同文件下载的方式不同,但是都需要通过上面所说的一般步骤,即都需要首先得到一个InputStream对象,然 后在对这个对象进行不同的操作,以下是对一个图片文件(字节文件)进行处理,我们在以上FileUtils类的基础上创建一个 HttpDownLoader类,以供文件下载时作为工具类调用:

[java] view plain copy
  1. publicclassHttpDownloader{
  2. privateURLurl=null;
  3. FileUtilsfileUtils=newFileUtils();
  4. publicintdownfile(StringurlStr,Stringpath,StringfileName)
  5. {
  6. if(fileUtils.isFileExist(path+fileName))
  7. {return1;}
  8. else{
  9. try{
  10. InputStreaminput=null;
  11. input=getInputStream(urlStr);
  12. FileresultFile=fileUtils.write2SDFromInput(path,fileName,input);
  13. if(resultFile==null)
  14. {
  15. return-1;
  16. }
  17. }catch(IOExceptione){
  18. //TODOAuto-generatedcatchblock
  19. e.printStackTrace();
  20. }
  21. }
  22. return0;
  23. }
  24. //由于得到一个InputStream对象是所有文件处理前必须的操作,所以将这个操作封装成了一个方法
  25. publicInputStreamgetInputStream(StringurlStr)throwsIOException
  26. {
  27. InputStreamis=null;
  28. try{
  29. url=newURL(urlStr);
  30. HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
  31. is=urlConn.getInputStream();
  32. }catch(MalformedURLExceptione){
  33. //TODOAuto-generatedcatchblock
  34. e.printStackTrace();
  35. }
  36. returnis;
  37. }
  38. }


下面编写Activity文件进行文件的操作:

[java] view plain copy
  1. publicclassMainActivityextendsActivity{
  2. privateButtondownfile=null;
  3. @Override
  4. publicvoidonCreate(BundlesavedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. downfile=(Button)findViewById(R.id.downfile);
  8. downfile.setOnClickListener(newView.OnClickListener(){
  9. downfile.setOnClickListener(newView.OnClickListener(){
  10. @Override
  11. publicvoidonClick(Viewv){
  12. //TODOAuto-generatedmethodstub
  13. HttpDownloaderhttpDownLoader=newHttpDownloader();
  14. intresult=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg","test/","test.jpg");
  15. if(result==0)
  16. {
  17. Toast.makeText(MainActivity.this,"下载成功!",Toast.LENGTH_SHORT).show();
  18. }
  19. elseif(result==1){
  20. Toast.makeText(MainActivity.this,"已有文件!",Toast.LENGTH_SHORT).show();
  21. }
  22. elseif(result==-1){
  23. Toast.makeText(MainActivity.this,"下载失败!",Toast.LENGTH_SHORT).show();
  24. }
  25. }
  26. });
  27. }
  28. @Override
  29. publicbooleanonCreateOptionsMenu(Menumenu){
  30. getMenuInflater().inflate(R.menu.activity_main,menu);
  31. returntrue;
  32. }
  33. }

注:在编写文件下载的IP地址时,不要用本地地址,比如:127.0.0.1,由于我在测试时用的Tomcat服务器,IP就直接用的本地地址,程序运行后一直没有报错,但是去SD卡中找文件时一直没有找到文件,最后改为电脑的IP地址后问题解决了。

上例中首先定义了一个HttpDownLoader类的对象httpdownloader,再调用该对象的downfile()方法,方法中第一个参数指的是文件下载的URL,第二个参数指的是准备存放到SD卡中的目录,第三个参数指的是文件存放的名称。

更多相关文章

  1. Android中使用putExtra()传递对象实例
  2. android下快速检索出媒体文件所在文件夹
  3. android 直接进行数据库操作
  4. ionic3文件目录介绍
  5. Android操作Uri的工具类
  6. android从未安装的apk文件里获取信息(包信息,资源信息)
  7. 提高开发效率-使用Android Studio Template快速生成模板文件

随机推荐

  1. SQL实现LeetCode(176.第二高薪水)
  2. Mysql8.0递归查询的简单用法示例
  3. SQL之各种join小结详细讲解
  4. SQL实现LeetCode(175.联合两表)
  5. 线上MySQL的自增id用尽怎么办
  6. 浅谈mysql join底层原理
  7. Mysql提权的多种姿势汇总
  8. 一篇文章带你深入了解Mysql触发器
  9. MySQL子查询中order by不生效问题的解决
  10. MySQL中utf8mb4排序规则示例