Android 学习 笔记_05. 文件下载

文件下载的步骤:

  1、创建一个HttpURLConnection对象

            HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();

  2、获得一个InputStream()对象   

            urlConn.getInputStream();

  3、访问网路的权限

           android.permission.INTERNET

   现做一个小程序如下,能够下载文本文件和Mp3文件

                       

 main.xml

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:orientation="vertical"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     tools:context=".Download_Activity" >
 7 
 8     <Button 
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content"
11         android:id="@+id/downloadText"
12         android:text="@string/downloadTextButton"/>
13     <Button 
14         android:layout_width="fill_parent"
15         android:layout_height="wrap_content"
16         android:id="@+id/downloadMp3"
17         android:text="@string/downloadMp3Button"/>
18 </LinearLayout>

Download_Activity.java

 1 package zzl.download;
 2 
 3 import zzl.utils.HttpDownload;
 4 import android.app.Activity;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.view.View.OnClickListener;
 8 import android.widget.Button;
 9 
10 public class Download_Activity extends Activity {
11 
12     private Button downloadMp3Button;
13     private Button downloadTextButton;
14     @Override
15     public void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.main);
18         downloadMp3Button=(Button)findViewById(R.id.downloadMp3);
19         downloadTextButton=(Button)findViewById(R.id.downloadText);
20         downloadMp3Button.setOnClickListener(new DownloadMp3Listener());
21         downloadTextButton.setOnClickListener(new DownloadTextListener());
22     }
23     class DownloadTextListener implements OnClickListener{
24 
25         @Override
26         public void onClick(View v) {
27             // TODO Auto-generated method stub
28             HttpDownload httpDownloader=new HttpDownload();
29             String lrc =httpDownloader.download("http://photo.weibo.com/152611965/wbphotos/large/photo_id/3549709337146075?refer=weibofeedv5");
30             System.out.println(lrc);
31         }
32     }
33     class DownloadMp3Listener implements OnClickListener{
34 
35         @Override
36         public void onClick(View v) {
37             // TODO Auto-generated method stub
38             HttpDownload httpDownloader=new HttpDownload();
39             int result =httpDownloader.downloadFile("http://photo.weibo.com/152611965/wbphotos/large/photo_id/3549709337146075?refer=weibofeedv5","photo_id/","3549709337146075?refer=weibofeedv5");
40             System.out.println(result);
41         }
42     }
43 
44 }

 

HttpDownload.java

 1 package zzl.utils;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.io.InputStreamReader;
 8 import java.net.HttpURLConnection;
 9 import java.net.URL;
10 
11 
12 /*前提:首先判断所下载的文件是否为纯文本文件
13  * 1.创建一个URL对象
14  * 2.通过URL对象获取HttpOpenConnection对象(代表和网络上的http对象的连接)
15  * 3.获取InputStream对象
16  * 4.读取数据
17  * 5.将读取的数据写入SD卡
18  * */
19 public class HttpDownload {
20     private URL url = null;
21     
22     //下载任何形式 的文本文件    
23     public String download(String urlStr){
24         StringBuffer sb = new StringBuffer();
25         String line = null;
26         BufferedReader bufr = null;
27         
28         try {                                                                        
29             // 创建一个URL对象:调用URL函数,将地址传入
30             url = new URL(urlStr);
31             //通过URL创建一个HTTP连接                                                                 
32              HttpURLConnection con =  (HttpURLConnection)url.openConnection();
33             //使用IO流读取数据,这里使用到了转换流,提高读取效率  【【 字节流转换成字符流再转换成读取行数据】】
34             bufr = new BufferedReader(new InputStreamReader(con.getInputStream()));
35             while((line = bufr.readLine())!=null){
36                 sb.append(line);
37             }
38             
39         } catch (Exception e) {
40             System.out.println("文本文件下载失败!");
41             e.printStackTrace();
42         }finally{
43             if(bufr!=null)
44                 try {
45                     bufr.close();
46                 } catch (IOException e) {
47                     System.out.println("文本文件读取流关闭失败!");
48                     e.printStackTrace();
49                 }
50         }
51         return sb.toString();
52         
53     }
54     //访问SD卡
55     /* 1.得到当前设备SD卡的目录
56      *     Environment.getExternalStorageDirectory()
57      * */
58     //可下载各种文件
59     //返回 -1:代表下载文件出错        返回0:代表下载文件成功             返回 1:代表文件已经存在
60     //fileName代表你将要存入SD卡中的文件名,可以定义自己的文件名
61     public int downloadFile(String url,String path,String fileName){
62         InputStream in = null;
63         try {
64             File_Utils utils = new File_Utils() ;
65             //如果存在该文件了则返回1
66             if(utils.isFileExist(path+fileName)){
67                 return 1;
68             }else{//否则则就获得否则则就通过调用File_Utils.java的write2SDFromInputStream函数写入SD卡中
69                 in = getInputStreamFromUrl(url);
70                 File resultFile = utils.write2SDFromInputStream(path, fileName, in);
71                 if(resultFile == null){
72                     return -1;
73                 }
74             }
75             
76         } catch (IOException e) {
77             e.printStackTrace();
78             return -1;
79         }finally{
80             if(in!=null){
81             try {
82                 in.close();
83             } catch (IOException e) {
84                 System.out.println("字节读取流关闭失败!");
85                 e.printStackTrace();
86               }
87             }
88         }
89         return 0;
90     }
91     
92     //将根据URL获取InputStream的功能封装起来,以便复用
93     public InputStream getInputStreamFromUrl(String urlStr) throws IOException{
94             url = new URL(urlStr);
95             HttpURLConnection con =  (HttpURLConnection) url.openConnection();
96             InputStream in = con.getInputStream();
97             return in;
98     }
99 }

File_Utils.java

 1 package zzl.utils;
 2 
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.io.OutputStream;
 8 
 9 import android.os.Environment;
10 
11 public class File_Utils {
12     private String SDPATH; 
13     public File_Utils(){
14         SDPATH = Environment.getExternalStorageDirectory()+"/";
15     }
16     //得到当前外部存储设备的目录
17     public String getSDPATH(){
18         return SDPATH;
19     }
20     
21     //在SD卡上创建文件:
22     public File createSDFile(String dirAndFilename) throws IOException{
23         File file = new File(SDPATH+dirAndFilename);
24         file.createNewFile();
25         return file;
26     } 
27     
28     //在SD卡上创建目录
29     public File createSDDir(String dirName){
30         File dir = new File(SDPATH+dirName);
31         dir.mkdirs();
32         return dir;
33     }
34     //判断SD卡上的文件夹是否存在
35     public boolean isFileExist(String fileName){
36         File file = new File(SDPATH + fileName);
37         return file.exists();
38     }
39 
40     //将一个InputStream里面的数据写到SD卡中
41     public File write2SDFromInputStream(String path,String fileName,InputStream in){
42         File file = null;
43         OutputStream out = null;
44         try {
45             createSDDir(path);
46             try{file = createSDFile(path+fileName);}
47             catch(Exception e){
48                 System.out.println("createSDFile 失败");
49             }
50             
51             out = new FileOutputStream(file);
52             byte buf[] = new byte[1024*5];
53             int ch = 0;
54             while((ch = in.read(buf))!=-1){
55                 out.write(buf);
56             }
57             out.flush();
58         
59         } catch (IOException e) {
60             System.out.println("SD写入失败!");
61             e.printStackTrace();
62         }finally{
63             if(out!=null)
64                 try {
65                     out.close();
66                 } catch (IOException e) {
67                     e.printStackTrace();
68                     System.out.println("SD写入流关闭失败!");
69                 }
70         }
71         return file;
72     }
73 
74 }

总结:

    1、要达到连接网络的效果,需要在download  Manifest 中加入下面三句代码:

        <uses-sdk android:minSdkVersion="4"/>
       <uses-permission android:name="android.permission.INTERNET"/>
       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    2、因为不是真正的连接到网路,测试的时候需要在cmd中输入adb  shell 进行验证,当然这个的操作我们之前在SQlite那一节中介绍过了

    3、总的整节视频看下来,总觉得还是很多东西没有消化的,很多mars老师自己写的东西,很多函数的调用还有一些不是很了解的,还是需要再研究一下的。

    4、点击下载文本文件,效果如下:

        

       而下载Mp3文件则还是有一定的bug,还需要再调试调试。

posted @ 2013-02-27 14:26  daomul  阅读(1230)  评论(0编辑  收藏  举报