Android:檔案下載和寫入SD卡學習小結

DM--Tutor發表於2012-11-08

    今天剛剛學習完Android檔案下載和寫入SD卡的,隨即做一個小結,以供以後學習查閱:


 一、檔案下載 

      Android開發中,有時需要從網上下載一些資源以供使用者使用,Android API中已經提供了很多直接可以用的類供大家使用,一般檔案下載需要通過三個步驟:

      1.建立一個HttpURLConnection物件:

// 建立一個URL物件,urlStr指的是網路IP地址
url = new URL(urlStr);
// 建立一個HttpURLConnection連線
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
      2.獲得一個InputStream物件:

InputStream input=null;
input=urlConn.getInputStream();
      3.設定訪問網路的許可權:

//在AndroidManifest.xml配置檔案中加入許可權資訊
<uses-permission android:name="android.permission.INTERNET"/>

二、訪問並寫入SD卡

     由於手機記憶體有限,所以一般需要將資料放入大容量容器SD卡中,不同手機SD卡所在目錄不一樣,這就需要我們們通過一個統一的函式找到SD卡所在的目錄,再對它進行操作,Android中提供了一個函式,可以查詢到基本上所有型別型號的手機SD卡所在的目錄:

//得到當前裝置SD卡的目錄
Environment.getExternalStorageDirectory();

     在訪問SD卡前還必須在配置檔案中設定許可權,這樣才可以最SD卡進行存取操作:

//在AndroidManifest.xml配置檔案中加入許可權資訊
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     以下是一個對SD操作經常用到的類,以後如果需要對SD卡操作,直接可以拿過來用:

public class FileUtils {

	private String SDPATH;

	public String getSDPATH() {
		return SDPATH;
	}
	public FileUtils() {
		//得到當前外部儲存裝置的目錄
		// /SDCARD
		SDPATH = Environment.getExternalStorageDirectory() + "/";
	}
	/**
	 * 在SD卡上建立檔案
	 * 
	 * @throws IOException
	 */
	public File creatSDFile(String fileName) throws IOException {
		File file = new File(SDPATH + fileName);
		file.createNewFile();
		return file;
	}
	
	/**
	 * 在SD卡上建立目錄
	 * 
	 * @param dirName
	 */
	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();
	}
	
	/**
	 * 將一個InputStream裡面的資料寫入到SD卡中
	 */
	public File write2SDFromInput(String path,String fileName,InputStream input){
		File file = null;
		OutputStream output = null;
		try{
			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;
	}
}


三、例項演示

     在對以上檔案下載和SD卡訪問基本知識瞭解的基礎上,下面進行舉例說明:

     檔案下載一般有文字檔案和位元組檔案,不同檔案下載的方式不同,但是都需要通過上面所說的一般步驟,即都需要首先得到一個InputStream物件,然後在對這個物件進行不同的操作,以下是對一個圖片檔案(位元組檔案)進行處理,我們在以上FileUtils類的基礎上建立一個HttpDownLoader類,以供檔案下載時作為工具類呼叫:

public class HttpDownloader {
	private URL url=null;
	FileUtils fileUtils=new FileUtils();
	public int downfile(String urlStr,String path,String fileName)
	{
		if(fileUtils.isFileExist(path+fileName))
			{return 1;}
		else{
		
		try {
			InputStream input=null;
			input = getInputStream(urlStr);
			File resultFile=fileUtils.write2SDFromInput(path, fileName, input);
			if(resultFile==null)
			{
				return -1;
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		}
		return 0;
	}
  //由於得到一個InputStream物件是所有檔案處理前必須的操作,所以將這個操作封裝成了一個方法
       public InputStream getInputStream(String urlStr) throws IOException
       {     
    	   InputStream is=null;
    	    try {
				url=new URL(urlStr);
				HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
				is=urlConn.getInputStream();
				
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
    	    return is;
       }
}

   下面編寫Activity檔案進行檔案的操作:

public class MainActivity extends Activity {

	private Button downfile=null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        downfile=(Button)findViewById(R.id.downfile);
        downfile.setOnClickListener(new View.OnClickListener() {
        downfile.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				HttpDownloader httpDownLoader=new HttpDownloader();
				  int result=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg", "test/", "test.jpg");
			      if(result==0)
			      {
			    	  Toast.makeText(MainActivity.this, "下載成功!", Toast.LENGTH_SHORT).show();
			      }
			      else if(result==1) {
			    	  Toast.makeText(MainActivity.this, "已有檔案!", Toast.LENGTH_SHORT).show();
				}
			      else if(result==-1){
			    	  Toast.makeText(MainActivity.this, "下載失敗!", Toast.LENGTH_SHORT).show();
			      }	
			}
		});
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
 注:在編寫檔案下載的IP地址時,不要用本地地址,比如:127.0.0.1,由於我在測試時用的Tomcat伺服器,IP就直接用的本地地址,程式執行後一直沒有報錯,但是去SD卡中找檔案時一直沒有找到檔案,最後改為電腦的IP地址後問題解決了。

       上例中首先定義了一個HttpDownLoader類的物件httpdownloader,再呼叫該物件的downfile()方法,方法中第一個引數指的是檔案下載的URL,第二個引數指的是準備存放到SD卡中的目錄,第三個引數指的是檔案存放的名稱。

  


相關文章