格式化

廣告

廣告2

2013年9月23日 星期一

[Android程式範例] http網頁下載檔案或文字

[Android程式範例] http網頁下載檔案或文字

[Android程式範例] http網頁下載檔案或文字

主要在使用時只要一句話! 
呼叫的方法是:

int result = httpDownloader.downFile("http://tpdb.speed2.hinet.net/test_010m.zip", "Android/yilan/", "hinet.zip");

會需要一些自訂類別的支持分別有下載用的HTTPDownload還有寫入檔案到SD卡的FileUtils
首先先展示一下HTTPDownload類別的定義
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HTTPDownload
{
    /**
     * 根據URL下載文件,前提是這個文件當中的內容是文本,函數的返回值就是文件當中的內容
     * 1.創建一個URL對象
     * 2.通過URL對象,創建一個HttpURLConnection對象
     * 3.得到InputStram
     * 4.從InputStream當中讀取數據
     */
    private URL url = null;

    public String downStr(String urlStr)//下載字元流的方法
    {
 /**
  * String和StringBuffer他們都可以存儲和操作字元串,即包含多個字元的字元串數據。
  * String類是字元串常量,是不可更改的常量。而StringBuffer是字元串變數,它的對象是可以擴充和修改的。
  */
 StringBuffer sb = new StringBuffer();
 String line = null;
 BufferedReader buffer = null;//BufferedReader類用於從緩衝區中讀取內容

 try
 {
     /**
      * 因為直接使用InputStream不好用,多以嵌套了BufferedReader,這個是讀取字元流的固定格式。
      */

     url = new URL(urlStr);// 創建一個URL對象  
     HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();// 創建一個Http連接
     buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));// 使用IO流讀取數據

     while ((line = buffer.readLine()) != null)
     {
  sb.append(line);
     }
 }
 catch (Exception e)
 {
     e.printStackTrace();
 }
 finally
 {
     try
     {
  buffer.close();
     }
     catch (Exception e)
     {
  e.printStackTrace();
     }
 }
 return sb.toString();
    }

    /**
     * -1:代表下載文件出錯
     * 0:代表下載文件成功
     * 1:代表文件已經存在
     */
    public int downFile(String urlStr, String path, String fileName)//下載文件的方法
    {
 InputStream inputStream = null;
 try
 {
     FileUtils fileUtils = new FileUtils();

     if (fileUtils.isFileExist(path + fileName))
     {
  boolean is = fileUtils.isFileExistDelete(path + fileName);
  if (is == false) return -1;
     }
     inputStream = getInputStreamFromUrl(urlStr);
     File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);
     if (resultFile == null)
     {
  return -1;
     }

 }
 catch (Exception e)
 {
     e.printStackTrace();
     return -1;
 }
 finally
 {
     try
     {
  inputStream.close();
     }
     catch (Exception e)
     {
  e.printStackTrace();
     }
 }
 return 0;
    }

    /**
     * 根據URL得到輸入流
     */
    public InputStream getInputStreamFromUrl(String urlStr) throws MalformedURLException, IOException
    {
 url = new URL(urlStr);// 創建一個URL對象 
 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();// 創建一個Http連接
 InputStream inputStream = urlConn.getInputStream();//得到輸入流

 return inputStream;
    }
}

再來展示一下FileUtils類別的定義
package com.unood.yilan;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.os.Environment;

public class FileUtils
{
    private String SDPATH;

    public String getSDPATH()
    {
 return SDPATH;
    }

    public FileUtils()
    {
 //得到當前SDCARD存儲設備的目錄 /SDCARD, Environment.getExternalStorageDirectory()這個方法比較通用
 SDPATH = Environment.getExternalStorageDirectory() + "/";
    }

    /**
     * 在SD卡上創建文件
     */
    public File creatSDFile(String fileName) throws IOException
    {
 File file = new File(SDPATH + fileName);
 file.createNewFile();
 return file;
    }

    /**
     * 在SD卡上創建目錄
     */
    public File creatSDDir(String dirName)
    {
 File dir = new File(SDPATH + dirName);
 dir.mkdir();
 return dir;
    }

    /**
     * 判斷SD卡上的文件夾是否存在
     */
    public boolean isFileExist(String fileName)
    {
 File file = new File(SDPATH + fileName);
 return file.exists();
    }
    
    /**
     * 判斷SD卡上的文件夾是否存在且刪除
     */
    public boolean isFileExistDelete(String fileName)
    {
 File file = new File(SDPATH + fileName);
 return file.delete();
    }

    /**
     * 將一個InputStream裡面的數據寫入到SD卡中
     */
    public File write2SDFromInput(String path, String fileName, InputStream input)
    {
 File file = null;
 OutputStream output = null;
 try
 //InputStream裡面的數據寫入到SD卡中的固定方法
 {
     creatSDDir(path);
     file = creatSDFile(path + fileName);
     output = new FileOutputStream(file);
     byte buffer[] = new byte[4 * 1024];
     while ((input.read(buffer)) != -1)
     {
  output.write(buffer);
     }
     output.flush();
 }
 catch (Exception e)
 {
     e.printStackTrace();
 }
 finally
 {
     try
     {
  output.close();
     }
     catch (Exception e)
     {
  e.printStackTrace();
     }
 }
 return file;
    }
}

沒有留言 :