Android 台灣中文網

標題: android開發(7) 文件下載 [打印本頁]

作者: 暗桌之光    時間: 2011-7-10 10:58
標題: android開發(7) 文件下載
我們在開發中經常需要從服務器下載文件,下載的內容可能有交換的信息,緩存的圖片,程序更新包等。我們使用URLConnection來實現下載。先看幾行代碼:
  1.                String urlDownload = "";
  2.                urlDownload = "http://www.baidu.com/img/baidu_sylogo1.gif";
  3.                 URL url = new URL(urlDownload );   
  4.                 // 打開連接   
  5.                 URLConnection con = url.openConnection();
  6.            
  7.                 // 輸入流   
  8.                 InputStream is = con.getInputStream();  
複製代碼

如上面的代碼所示,指定一個下載的目標鏈接,我們上面指定了一個圖片地址。然後構建一個URL對象,調用該對象的openConnection方法來建立一個數據通路(連接)。代碼的最後一行使用 con.getInputStream,拿到一個輸入流對象,通過這個流對像我們就可以讀取到這個文件的內容了。下面要做的,就是讀取這個流,將流寫入我們的本地文件。不過在這之前,我們還要說下這個方法:
  1.     //獲得文件的長度
  2.                 int contentLength = con.getContentLength();
  3.                 System.out.println("長度 :"+contentLength);
複製代碼

獲得文件長度的方法。ContentLength是不很熟啊。它是http協議裡描述頭(head)部分的描述屬性之一。實際這裡是發送了一個http請求,分析了返回(response)裡數據內容。

我們常常會把文件下載到手機的存儲卡裡,所以還會用到獲得存儲卡路徑的方法:
  1. // 獲得存儲卡路徑,構成 保存文件的目標路徑
  2.                 String dirName = "";
  3.                 dirName = Environment.getExternalStorageDirectory()+"/MyDownload/";
  4.                 File f = new File(dirName);
  5.                 if(!f.exists())
  6.                 {
  7.                     f.mkdir();
  8.                 }
複製代碼

Environment.getExternalStorageDirectory() 方法會返回一個字符串,指示了存儲卡的路徑。我們拼接字符串出一個準備存放下載文件的文件夾。並先判斷文件夾是是否存在,如果不存在,則新建一個文件夾。

做完了上面的準備後,基本就能實現下載了。我們看看主要的完整代碼。
下載前的準備工作:
  1. //要下載的文件路徑
  2. String urlDownload = "";
  3. //urlDownload =  "http://192.168.3.39/text.txt%22;
  4. urlDownload = "http://www.baidu.com/img/baidu_sylogo1.gif%22;
  5. // 獲得存儲卡路徑,構成 保存文件的目標路徑
  6. String dirName = "";
  7. dirName = Environment.getExternalStorageDirectory()+"/MyDownload/";
  8. File f = new File(dirName);
  9. if(!f.exists())
  10. {
  11.     f.mkdir();
  12. }
複製代碼

下載的操作:
  1. //準備拼接新的文件名(保存在存儲卡後的文件名)
  2.         String newFilename = _urlStr.substring(_urlStr.lastIndexOf("/")+1);
  3.         newFilename = _dirName + newFilename;
  4.         File file = new File(newFilename);
  5.         //如果目標文件已經存在,則刪除。產生覆蓋舊文件的效果
  6.         if(file.exists())
  7.         {
  8.             file.delete();
  9.         }
  10.         try {
  11.                // 構造URL   
  12.                 URL url = new URL(_urlStr);   
  13.                 // 打開連接   
  14.                 URLConnection con = url.openConnection();
  15.                 //獲得文件的長度
  16.                 int contentLength = con.getContentLength();
  17.                 System.out.println("長度 :"+contentLength);
  18.                 // 輸入流   
  19.                 InputStream is = con.getInputStream();   
  20.               
  21.                 // 1K的數據緩衝   
  22.                 byte[] bs = new byte[1024];   
  23.                 // 讀取到的數據長度   
  24.                 int len;   
  25.                // 輸出的文件流   
  26.                 OutputStream os = new FileOutputStream(newFilename);   
  27.                 // 開始讀取   
  28.                 while ((len = is.read(bs)) != -1) {   
  29.                   os.write(bs, 0, len);   
  30.                 }   
  31.                 // 完畢,關閉所有鏈接   
  32.                 os.close();   
  33.                 is.close();
  34.             
  35.         } catch (Exception e) {
  36.                 e.printStackTrace();
  37.         }
複製代碼

Demo.Download.rar (43.72 KB, 下載次數: 17)