Android 台灣中文網
標題: android開發(7) 文件下載 [打印本頁]
作者: 暗桌之光 時間: 2011-7-10 10:58
標題: android開發(7) 文件下載
我們在開發中經常需要從服務器下載文件,下載的內容可能有交換的信息,緩存的圖片,程序更新包等。我們使用URLConnection來實現下載。先看幾行代碼:
- String urlDownload = "";
- urlDownload = "http://www.baidu.com/img/baidu_sylogo1.gif";
- URL url = new URL(urlDownload );
- // 打開連接
- URLConnection con = url.openConnection();
-
- // 輸入流
- InputStream is = con.getInputStream();
複製代碼
如上面的代碼所示,指定一個下載的目標鏈接,我們上面指定了一個圖片地址。然後構建一個URL對象,調用該對象的openConnection方法來建立一個數據通路(連接)。代碼的最後一行使用 con.getInputStream,拿到一個輸入流對象,通過這個流對像我們就可以讀取到這個文件的內容了。下面要做的,就是讀取這個流,將流寫入我們的本地文件。不過在這之前,我們還要說下這個方法:
- //獲得文件的長度
- int contentLength = con.getContentLength();
- System.out.println("長度 :"+contentLength);
複製代碼
獲得文件長度的方法。ContentLength是不很熟啊。它是http協議裡描述頭(head)部分的描述屬性之一。實際這裡是發送了一個http請求,分析了返回(response)裡數據內容。
我們常常會把文件下載到手機的存儲卡裡,所以還會用到獲得存儲卡路徑的方法:
- // 獲得存儲卡路徑,構成 保存文件的目標路徑
- String dirName = "";
- dirName = Environment.getExternalStorageDirectory()+"/MyDownload/";
- File f = new File(dirName);
- if(!f.exists())
- {
- f.mkdir();
- }
複製代碼
Environment.getExternalStorageDirectory() 方法會返回一個字符串,指示了存儲卡的路徑。我們拼接字符串出一個準備存放下載文件的文件夾。並先判斷文件夾是是否存在,如果不存在,則新建一個文件夾。
做完了上面的準備後,基本就能實現下載了。我們看看主要的完整代碼。
下載前的準備工作:
- //要下載的文件路徑
- String urlDownload = "";
- //urlDownload = "http://192.168.3.39/text.txt%22;
- urlDownload = "http://www.baidu.com/img/baidu_sylogo1.gif%22;
- // 獲得存儲卡路徑,構成 保存文件的目標路徑
- String dirName = "";
- dirName = Environment.getExternalStorageDirectory()+"/MyDownload/";
- File f = new File(dirName);
- if(!f.exists())
- {
- f.mkdir();
- }
複製代碼
下載的操作:
- //準備拼接新的文件名(保存在存儲卡後的文件名)
- String newFilename = _urlStr.substring(_urlStr.lastIndexOf("/")+1);
- newFilename = _dirName + newFilename;
- File file = new File(newFilename);
- //如果目標文件已經存在,則刪除。產生覆蓋舊文件的效果
- if(file.exists())
- {
- file.delete();
- }
- try {
- // 構造URL
- URL url = new URL(_urlStr);
- // 打開連接
- URLConnection con = url.openConnection();
- //獲得文件的長度
- int contentLength = con.getContentLength();
- System.out.println("長度 :"+contentLength);
- // 輸入流
- InputStream is = con.getInputStream();
-
- // 1K的數據緩衝
- byte[] bs = new byte[1024];
- // 讀取到的數據長度
- int len;
- // 輸出的文件流
- OutputStream os = new FileOutputStream(newFilename);
- // 開始讀取
- while ((len = is.read(bs)) != -1) {
- os.write(bs, 0, len);
- }
- // 完畢,關閉所有鏈接
- os.close();
- is.close();
-
- } catch (Exception e) {
- e.printStackTrace();
- }
複製代碼
Demo.Download.rar
(43.72 KB, 下載次數: 17)