android 文件下载和保存

转载:http://blog.csdn.net/youmingyu/article/details/52583409

这个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

[java]  view plain  copy
  1. package fk.androiddemo_009;  
  2.   
  3. import android.os.Environment;  
  4.   
  5. import java.io.File;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.OutputStream;  
  10.   
  11. /** 
  12.  * Created by Administrator on 2016/9/14. 
  13.  */  
  14. public class FileUtils {  
  15.   
  16.     private String SDCardRoot;  
  17.   
  18.     public FileUtils(){  
  19.         //得到当前外部存储设备的目录  
  20.         SDCardRoot= Environment.getExternalStorageDirectory()+File.separator;  
  21.         //File.separator为文件分隔符”/“,方便之后在目录下创建文件  
  22.     }  
  23.   
  24.     //在SD卡上创建文件  
  25.     public File createFileInSDCard(String fileName,String dir) throws IOException {  
  26.         File file=new File(SDCardRoot+dir+File.separator+fileName);  
  27.         file.createNewFile();  
  28.         return file;  
  29.     }  
  30.   
  31.     //在SD卡上创建目录  
  32.     public File createSDDir(String dir)throws IOException{  
  33.         File dirFile=new File(SDCardRoot+dir);  
  34.         dirFile.mkdir();//mkdir()只能创建一层文件目录,mkdirs()可以创建多层文件目录  
  35.         return dirFile;  
  36.     }  
  37.   
  38.     //判断文件是否存在  
  39.     public boolean isFileExist(String fileName,String dir){  
  40.         File file=new File(SDCardRoot+dir+File.separator+fileName);  
  41.         return file.exists();  
  42.     }  
  43.   
  44.     //将一个InoutStream里面的数据写入到SD卡中  
  45.     public File write2SDFromInput(String fileName,String dir,InputStream input){  
  46.         File file=null;  
  47.         OutputStream output=null;  
  48.         try {  
  49.             //创建目录  
  50.             createSDDir(dir);  
  51.             //创建文件  
  52.             file=createFileInSDCard(fileName,dir);  
  53.             //写数据流  
  54.             output=new FileOutputStream(file);  
  55.             byte buffer[]=new byte[4*1024];//每次存4K  
  56.             int temp;  
  57.             //写入数据  
  58.             while((temp=input.read(buffer))!=-1){  
  59.                 output.write(buffer,0,temp);  
  60.             }  
  61.             output.flush();  
  62.         } catch (Exception e) {  
  63.             System.out.println("写数据异常:"+e);  
  64.         }  
  65.         finally{  
  66.             try {  
  67.                 output.close();  
  68.             } catch (Exception e2) {  
  69.                 System.out.println(e2);  
  70.             }  
  71.         }  
  72.         return file;  
  73.     }  
  74.   
  75. }  


下载工具类:HttpDownloader.java

[java]  view plain  copy
  1. package fk.androiddemo_009;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.InputStreamReader;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.URL;  
  10.   
  11. /** 
  12.  * Created by Administrator on 2016/9/14. 
  13.  */  
  14. public class HttpDownloader {  
  15.     String line=null;  
  16.     StringBuffer strBuffer=new StringBuffer();  
  17.     BufferedReader bufferReader=null;  
  18.   
  19.     //下载小型的文档文件,返回文档的String字符串  
  20.     public String downloadFiles(String urlStr){  
  21.         try {  
  22.             InputStream inputStream=getInputStreamFromUrl(urlStr);  
  23.             bufferReader=new BufferedReader(new InputStreamReader(inputStream));  
  24.             while((line=bufferReader.readLine())!=null){  
  25.                 strBuffer.append(line+'\n');  
  26.             }  
  27.         } catch (Exception e) {  
  28.             strBuffer.append("something is wrong!!");  
  29.             System.out.println("读取数据异常:"+e);  
  30.         } finally{  
  31.             try {  
  32.                 bufferReader.close();  
  33.             } catch (Exception e) {  
  34.                 strBuffer.append("something is wrong!!");  
  35.                 e.printStackTrace();  
  36.             }  
  37.         }  
  38.         return strBuffer.toString();  
  39.     }  
  40.   
  41.     //可以下载任意文件,例如MP3,并把文件存储在制定目录(-1:下载失败,0:下载成功,1:文件已存在)  
  42.     public int downloadFiles(String urlStr,String path,String fileName){  
  43.         try {  
  44.             FileUtils fileUtils=new FileUtils();  
  45.             if(fileUtils.isFileExist(fileName,path)) return 1;//判断文件是否存在  
  46.             else{  
  47.                 InputStream inputStream=getInputStreamFromUrl(urlStr);  
  48.                 File resultFile=fileUtils.write2SDFromInput(fileName,path,inputStream);  
  49.                 if(resultFile==nullreturn -1;  
  50.             }  
  51.         } catch (Exception e) {  
  52.             System.out.println("读写数据异常:"+e);  
  53.             return -1;  
  54.         }  
  55.         return 0;  
  56.     }  
  57.   
  58.     public InputStream getInputStreamFromUrl(String urlStr)throws IOException {  
  59.         //创建一个URL对象  
  60.         URL url=new URL(urlStr);  
  61.         //创建一个HTTP链接  
  62.         HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();  
  63.         //使用IO流获取数据  
  64.         InputStream inputStream=urlConn.getInputStream();  
  65.         return inputStream;  
  66.     }  
  67.   
  68. }  


主界面:MainActivity.java

[java]  view plain  copy
  1. package fk.androiddemo_009;  
  2.   
  3. import android.support.v7.app.AppCompatActivity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.widget.Button;  
  7.   
  8. //1,在Manifest文件中注册Internet和读写SDCard的权限  
  9. //2,下载不能在主线程中进行,要开分线程  
  10. public class MainActivity extends AppCompatActivity implements View.OnClickListener{  
  11.     Button but1,but2;  
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.activity_main);  
  16.   
  17.         but1=(Button)findViewById(R.id.but1);  
  18.         but1.setOnClickListener(this);  
  19.         but2=(Button)findViewById(R.id.but2);  
  20.         but2.setOnClickListener(this);  
  21.     }  
  22.   
  23.     @Override  
  24.     public void onClick(View v) {  
  25.         if(v==but1){  
  26.             new downloadFileThread().start();  
  27.         }else if(v==but2){  
  28.             new downloadMP3Thread().start();  
  29.         }  
  30.     }  
  31.   
  32.     class downloadFileThread extends Thread{  
  33.         public void run(){  
  34.             HttpDownloader httpDownloader=new HttpDownloader();  
  35.             String fileData=httpDownloader.downloadFiles("http://mystudy.bj.bcebos.com/AndroidDemo_009.xml");  
  36.             System.out.println(fileData);  
  37.         }  
  38.     }  
  39.   
  40.     class downloadMP3Thread extends Thread{  
  41.         public void run(){  
  42.             HttpDownloader httpDownloader=new HttpDownloader();  
  43.             int downloadResult=httpDownloader.downloadFiles(  
  44.                     "http://fengkui.bj.bcebos.com/%E8%B6%B3%E9%9F%B3.mp3","BoBoMusic","足音.mp3");  
  45.             System.out.println("下载结果:"+downloadResult);  
  46.         }  
  47.     }  
  48. }  


运行截图:



PS:有一点需要注意,在Android6.0及以上的系统,由于权限申请的改动,此demo安装后需要在APP管理中手动打开存储权限才能正常运行,否则无法向存储器中写数据,具体原因可以参考这两篇博文:
http://unclechen.github.io/2016/03/05/Android6.0%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9D%83%E9%99%90%E7%AE%80%E4%BB%8B/

http://unclechen.github.io/2016/03/06/Android6.0%E6%9D%83%E9%99%90%E9%80%82%E9%85%8D%E4%B9%8BSD%E5%8D%A1%E5%86%99%E5%85%A5/?utm_source=tuicool&utm_medium=referral

虚拟机中打开存储权限的位置:



如果想要在虚拟机上查看下载的MP3文件,可以在SDK目录下的platform-tools中利用adb.exe查看,命令如下,原来亦可以使用DDMS,但是现在需要打开权限挺麻烦。

猜你喜欢

转载自blog.csdn.net/li_yu_csdn/article/details/79313837