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

jopen 10年前發布 | 22K 次閱讀 Android Android開發 移動開發

 一、文件下載 

      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卡中的目錄,第三個參數指的是文件存放的名稱。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!