android 檔案下載和儲存
阿新 • • 發佈:2019-01-08
這個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"/>
完整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,但是現在需要開啟許可權挺麻煩。