Android:文件下載和寫入SD卡學習小結

    今天剛剛學習完Android文件下載和寫入SD卡的,隨即作一個小結,以供之後學習查閱: java


 1、文件下載  android

      Android開發中,有時須要從網上下載一些資源以供用戶使用,Android API中已經提供了不少直接能夠用的類供你們使用,通常文件下載須要經過三個步驟: 服務器

      1.建立一個HttpURLConnection對象: 網絡

[java] view plain copy
  1. // 建立一個URL對象,urlStr指的是網絡IP地址  
  2. url = new URL(urlStr);  
  3. // 建立一個HttpURLConnection鏈接  
  4. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
      2.得到一個InputStream對象:
[java] view plain copy
  1. InputStream input=null;  
  2. input=urlConn.getInputStream();  
      3.設置訪問網絡的權限:
[java] view plain copy
  1. //在AndroidManifest.xml配置文件中加入權限信息  
  2. <uses-permission android:name="android.permission.INTERNET"/>  

2、訪問並寫入SD卡 ide

     因爲手機內存有限,因此通常須要將資料放入大容量容器SD卡中,不一樣手機SD卡所在目錄不同,這就須要我們經過一個統一的函數找到SD卡所在的目錄,再對它進行操做,Android中提供了一個函數,能夠查找到基本上全部類型型號的手機SD卡所在的目錄: 函數

[java] view plain copy
  1. //獲得當前設備SD卡的目錄  
  2. Environment.getExternalStorageDirectory();  

     在訪問SD卡前還必須在配置文件中設置權限,這樣才能夠最SD卡進行存取操做: 工具

[java] view plain copy
  1. //在AndroidManifest.xml配置文件中加入權限信息  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
     如下是一個對SD操做常常用到的類,之後若是須要對SD卡操做,直接能夠拿過來用:
[java] view plain copy
  1. public class FileUtils {  
  2.   
  3.     private String SDPATH;  
  4.   
  5.     public String getSDPATH() {  
  6.         return SDPATH;  
  7.     }  
  8.     public FileUtils() {  
  9.         //獲得當前外部存儲設備的目錄  
  10.         // /SDCARD  
  11.         SDPATH = Environment.getExternalStorageDirectory() + "/";  
  12.     }  
  13.     /** 
  14.      * 在SD卡上建立文件 
  15.      *  
  16.      * @throws IOException 
  17.      */  
  18.     public File creatSDFile(String fileName) throws IOException {  
  19.         File file = new File(SDPATH + fileName);  
  20.         file.createNewFile();  
  21.         return file;  
  22.     }  
  23.       
  24.     /** 
  25.      * 在SD卡上建立目錄 
  26.      *  
  27.      * @param dirName 
  28.      */  
  29.     public File creatSDDir(String dirName) {  
  30.         File dir = new File(SDPATH + dirName);  
  31.         dir.mkdir();  
  32.         return dir;  
  33.     }  
  34.   
  35.     /** 
  36.      * 判斷SD卡上的文件夾是否存在 
  37.      */  
  38.     public boolean isFileExist(String fileName){  
  39.         File file = new File(SDPATH + fileName);  
  40.         return file.exists();  
  41.     }  
  42.       
  43.     /** 
  44.      * 將一個InputStream裏面的數據寫入到SD卡中 
  45.      */  
  46.     public File write2SDFromInput(String path,String fileName,InputStream input){  
  47.         File file = null;  
  48.         OutputStream output = null;  
  49.         try{  
  50.             creatSDDir(path);  
  51.             file = creatSDFile(path + fileName);  
  52.             output = new FileOutputStream(file);  
  53.             byte buffer [] = new byte[4 * 1024];  
  54.             while((input.read(buffer)) != -1){  
  55.                 output.write(buffer);  
  56.             }  
  57.             output.flush();  
  58.         }  
  59.         catch(Exception e){  
  60.             e.printStackTrace();  
  61.         }  
  62.         finally{  
  63.             try{  
  64.                 output.close();  
  65.             }  
  66.             catch(Exception e){  
  67.                 e.printStackTrace();  
  68.             }  
  69.         }  
  70.         return file;  
  71.     }  
  72. }  


3、實例演示 學習

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

     文件下載通常有文本文件和字節文件,不一樣文件下載的方式不一樣,可是都須要經過上面所說的通常步驟,即都須要首先獲得一個InputStream對象,然 後在對這個對象進行不一樣的操做,如下是對一個圖片文件(字節文件)進行處理,咱們在以上FileUtils類的基礎上建立一個 HttpDownLoader類,以供文件下載時做爲工具類調用: this

[java] view plain copy
  1. public class HttpDownloader {  
  2.     private URL url=null;  
  3.     FileUtils fileUtils=new FileUtils();  
  4.     public int downfile(String urlStr,String path,String fileName)  
  5.     {  
  6.         if(fileUtils.isFileExist(path+fileName))  
  7.             {return 1;}  
  8.         else{  
  9.           
  10.         try {  
  11.             InputStream input=null;  
  12.             input = getInputStream(urlStr);  
  13.             File resultFile=fileUtils.write2SDFromInput(path, fileName, input);  
  14.             if(resultFile==null)  
  15.             {  
  16.                 return -1;  
  17.             }  
  18.         } catch (IOException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         }  
  22.           
  23.         }  
  24.         return 0;  
  25.     }  
  26.   //因爲獲得一個InputStream對象是全部文件處理前必須的操做,因此將這個操做封裝成了一個方法  
  27.        public InputStream getInputStream(String urlStr) throws IOException  
  28.        {       
  29.            InputStream is=null;  
  30.             try {  
  31.                 url=new URL(urlStr);  
  32.                 HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();  
  33.                 is=urlConn.getInputStream();  
  34.                   
  35.             } catch (MalformedURLException e) {  
  36.                 // TODO Auto-generated catch block  
  37.                 e.printStackTrace();  
  38.             }  
  39.               
  40.             return is;  
  41.        }  
  42. }  

   下面編寫Activity文件進行文件的操做:
[java] view plain copy
  1. public class MainActivity extends Activity {  
  2.   
  3.     private Button downfile=null;  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.         downfile=(Button)findViewById(R.id.downfile);  
  9.         downfile.setOnClickListener(new View.OnClickListener() {  
  10.         downfile.setOnClickListener(new View.OnClickListener() {  
  11.               
  12.             @Override  
  13.             public void onClick(View v) {  
  14.                 // TODO Auto-generated method stub  
  15.                 HttpDownloader httpDownLoader=new HttpDownloader();  
  16.                   int result=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg""test/""test.jpg");  
  17.                   if(result==0)  
  18.                   {  
  19.                       Toast.makeText(MainActivity.this"下載成功!", Toast.LENGTH_SHORT).show();  
  20.                   }  
  21.                   else if(result==1) {  
  22.                       Toast.makeText(MainActivity.this"已有文件!", Toast.LENGTH_SHORT).show();  
  23.                 }  
  24.                   else if(result==-1){  
  25.                       Toast.makeText(MainActivity.this"下載失敗!", Toast.LENGTH_SHORT).show();  
  26.                   }   
  27.             }  
  28.         });  
  29.     }  
  30.   
  31.     @Override  
  32.     public boolean onCreateOptionsMenu(Menu menu) {  
  33.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  34.         return true;  
  35.     }  
  36. }  
 注:在編寫文件下載的IP地址時,不要用本地地址,好比:127.0.0.1,因爲我在測試時用的Tomcat服務器,IP就直接用的本地地址,程序運行後一直沒有報錯,可是去SD卡中找文件時一直沒有找到文件,最後改成電腦的IP地址後問題解決了。

       上例中首先定義了一個HttpDownLoader類的對象httpdownloader,再調用該對象的downfile()方法,方法中第一個參數指的是文件下載的URL,第二個參數指的是準備存放到SD卡中的目錄,第三個參數指的是文件存放的名稱。

相關文章
相關標籤/搜索