程序员人生 网站导航

android 文件下载和保存

栏目:综合技术时间:2016-11-22 08:16:57
        这个demo演示从网上下载文件并保存得手机,demo中可以下载1个XML文件并在Console窗口输出,还可以下载1个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()只能创建1层文件目录,mkdirs()可以创建多层文件目录 return dirFile; } //判断文件是不是存在 public boolean isFileExist(String fileName,String dir){ File file=new File(SDCardRoot+dir+File.separator+fileName); return file.exists(); } //将1个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))!=⑴){ 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,并把文件存储在制定目录(⑴:下载失败,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 ⑴; } } catch (Exception e) { System.out.println("读写数据异常:"+e); return ⑴; } return 0; } public InputStream getInputStreamFromUrl(String urlStr)throws IOException { //创建1个URL对象 URL url=new URL(urlStr); //创建1个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); } } }


运行截图:



PS:有1点需要注意,在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,但是现在需要打开权限挺麻烦。


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐