1. 程式人生 > >android 檔案下載和儲存

android 檔案下載和儲存

        這個demo演示從網上下載檔案並儲存到手機,demo中可以下載一個XML檔案並在Console視窗輸出,還可以下載一個MP3檔案並儲存到手機儲存目錄中的BoBoMusic資料夾中,下載儲存成功會返回:0。(XML和MP3檔案我已經傳到百度的物件儲存中,方便大家呼叫demo中的URL除錯)

完整demo:下載地址

首先:在Manifest檔案中新增訪問網路和讀寫儲存的許可權
    <uses-permission
        android:name="android.permission.INTERNET"/>
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然後:檔案工具類 FileUtils.java

package fk.androiddemo_009;

import android.os.Environment;

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

/**
 * Created by Administrator on 2016/9/14.
 */
public class FileUtils {

    private String SDCardRoot;

    public FileUtils(){
        //得到當前外部儲存裝置的目錄
        SDCardRoot= Environment.getExternalStorageDirectory()+File.separator;
        //File.separator為檔案分隔符”/“,方便之後在目錄下建立檔案
    }

    //在SD卡上建立檔案
    public File createFileInSDCard(String fileName,String dir) throws IOException {
        File file=new File(SDCardRoot+dir+File.separator+fileName);
        file.createNewFile();
        return file;
    }

    //在SD卡上建立目錄
    public File createSDDir(String dir)throws IOException{
        File dirFile=new File(SDCardRoot+dir);
        dirFile.mkdir();//mkdir()只能建立一層檔案目錄,mkdirs()可以建立多層檔案目錄
        return dirFile;
    }

    //判斷檔案是否存在
    public boolean isFileExist(String fileName,String dir){
        File file=new File(SDCardRoot+dir+File.separator+fileName);
        return file.exists();
    }

    //將一個InoutStream裡面的資料寫入到SD卡中
    public File write2SDFromInput(String fileName,String dir,InputStream input){
        File file=null;
        OutputStream output=null;
        try {
            //建立目錄
            createSDDir(dir);
            //建立檔案
            file=createFileInSDCard(fileName,dir);
            //寫資料流
            output=new FileOutputStream(file);
            byte buffer[]=new byte[4*1024];//每次存4K
            int temp;
            //寫入資料
            while((temp=input.read(buffer))!=-1){
                output.write(buffer,0,temp);
            }
            output.flush();
        } catch (Exception e) {
            System.out.println("寫資料異常:"+e);
        }
        finally{
            try {
                output.close();
            } catch (Exception e2) {
                System.out.println(e2);
            }
        }
        return file;
    }

}

下載工具類:HttpDownloader.java

package fk.androiddemo_009;

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.URL;

/**
 * Created by Administrator on 2016/9/14.
 */
public class HttpDownloader {
    String line=null;
    StringBuffer strBuffer=new StringBuffer();
    BufferedReader bufferReader=null;

    //下載小型的文件檔案,返回文件的String字串
    public String downloadFiles(String urlStr){
        try {
            InputStream inputStream=getInputStreamFromUrl(urlStr);
            bufferReader=new BufferedReader(new InputStreamReader(inputStream));
            while((line=bufferReader.readLine())!=null){
                strBuffer.append(line+'\n');
            }
        } catch (Exception e) {
            strBuffer.append("something is wrong!!");
            System.out.println("讀取資料異常:"+e);
        } finally{
            try {
                bufferReader.close();
            } catch (Exception e) {
                strBuffer.append("something is wrong!!");
                e.printStackTrace();
            }
        }
        return strBuffer.toString();
    }

    //可以下載任意檔案,例如MP3,並把檔案儲存在制定目錄(-1:下載失敗,0:下載成功,1:檔案已存在)
    public int downloadFiles(String urlStr,String path,String fileName){
        try {
            FileUtils fileUtils=new FileUtils();
            if(fileUtils.isFileExist(fileName,path)) return 1;//判斷檔案是否存在
            else{
                InputStream inputStream=getInputStreamFromUrl(urlStr);
                File resultFile=fileUtils.write2SDFromInput(fileName,path,inputStream);
                if(resultFile==null) return -1;
            }
        } catch (Exception e) {
            System.out.println("讀寫資料異常:"+e);
            return -1;
        }
        return 0;
    }

    public InputStream getInputStreamFromUrl(String urlStr)throws IOException {
        //建立一個URL物件
        URL url=new URL(urlStr);
        //建立一個HTTP連結
        HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
        //使用IO流獲取資料
        InputStream inputStream=urlConn.getInputStream();
        return inputStream;
    }

}

主介面:MainActivity.java

package fk.androiddemo_009;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

//1,在Manifest檔案中註冊Internet和讀寫SDCard的許可權
//2,下載不能在主執行緒中進行,要開分執行緒
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button but1,but2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        but1=(Button)findViewById(R.id.but1);
        but1.setOnClickListener(this);
        but2=(Button)findViewById(R.id.but2);
        but2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v==but1){
            new downloadFileThread().start();
        }else if(v==but2){
            new downloadMP3Thread().start();
        }
    }

    class downloadFileThread extends Thread{
        public void run(){
            HttpDownloader httpDownloader=new HttpDownloader();
            String fileData=httpDownloader.downloadFiles("http://mystudy.bj.bcebos.com/AndroidDemo_009.xml");
            System.out.println(fileData);
        }
    }

    class downloadMP3Thread extends Thread{
        public void run(){
            HttpDownloader httpDownloader=new HttpDownloader();
            int downloadResult=httpDownloader.downloadFiles(
                    "http://fengkui.bj.bcebos.com/%E8%B6%B3%E9%9F%B3.mp3","BoBoMusic","足音.mp3");
            System.out.println("下載結果:"+downloadResult);
        }
    }
}

執行截圖:


虛擬機器中開啟儲存許可權的位置:


如果想要在虛擬機器上檢視下載的MP3檔案,可以在SDK目錄下的platform-tools中利用adb.exe檢視,命令如下,原來亦可以使用DDMS,但是現在需要開啟許可權挺麻煩。