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

1、文件下載 

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

       1.建立一個HttpURLConnection對象: android

[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卡 服務器

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

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

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

[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.     } 


3、實例演示 函數

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

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

[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.        } 

    下面編寫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.     } 
注:在編寫文件下載的IP地址時,不要用本地地址,好比:127.0.0.1,因爲我在測試時用的Tomcat服務器,IP就直接用的本地地址,程序運行後一直沒有報錯,可是去SD卡中找文件時一直沒有找到文件,最後改成電腦的IP地址後問題解決了。

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

相關文章
相關標籤/搜索