这个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];//每次存4Kint 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;@Overrideprotected 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);}@Overridepublic 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:有一点需要注意,在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,但是现在需要打开权限挺麻烦。

android 文件下载和保存相关推荐

  1. android程序内下载文件,android文件下载代码 android程序 里如何编写下载代码

    android开发文件下载在手机报错 package cc.download; import android.app.Activity;import android.os我比任何人都懂你不会真的陪我到 ...

  2. android 使用SharedPreferences保存对象

    今天,简单讲讲Android如何使用SharedPreferences保存对象. 记得之前写过一遍博客关于android如何使用SharedPreferences保存List<String> ...

  3. android 将byte[]保存到手机

    今天,讲讲如何把程序的byte[]保存到手机,并且作为文件可以读取. package com.example.edittextresearch;import java.io.BufferedOutpu ...

  4. Android 文件下载,根据url获取真正的文件名和后缀名(包括重定向的url)

    Android文件下载时,有时候我们需要根据url拿到要下载文件的名字和后缀. url分两种, 一种是静态url:即url后面就是文件名,例如:https://qd.myapp.com/myapp/q ...

  5. android view 存值,在android studio中保存textview和复选框的值

    问:如何在android studio中保存文本视图和复选框的值,以便稍后我进入该活动时以及在设置新值然后保持新值时可见设置的数据. 答:SharedPreferences用于在Android中存储原 ...

  6. 26.Android 下载图片保存到相册

    26.Android 下载图片保存到相册 Android 下载图片保存到相册 前言 实现思路 自定义Dialog 自定义Handler 自定义AsyncTask AndroidManifest配置权限 ...

  7. android 清空sp数据,Android 使用 SharedPreferences 保存少量数据的实现代码

    1 SharedPreferences 介绍 SharedPreferences是使用键值对的方式来存储数据的 SharedPreferences share = getSharedPreferenc ...

  8. android 下载进度条代码实现,Android 文件下载进度条的实现

    Android 中很多地方都需要用到线程下载.下面我谢了个简单的下载图片的demo.望对你们有到帮助. 首先,配置权限, 在 AndroidManifest.xml里面的application节点下面 ...

  9. sketch生成android代码,java – 从Android Processing Sketch保存图像

    我正在尝试从我的 Android Processing草图中保存图像,但是我收到错误.如何将草图保存到用户手机图库中的图像文件? public void draw(){ beginShape(); f ...

  10. Android中实现保存和读取文本文件到内部存储器(实现简易的记事本为例)

    场景 在Android应用中需要将某些文本内容保存到存储器中的txt文件中. 在显示时还需要将txt文件的内容读取加载出来.形成一个简单记事本的效果 注: 博客: https://blog.csdn. ...

最新文章

  1. CMRNet++:一种相机在激光雷达构建地图中的定位方案
  2. AI 一分钟 | 独角兽旷视被爆明年一季度上市;阿里达摩院再得顶级大牛,计算机理论最高奖得主马里奥加盟量子实验室
  3. 商城分类表-二级,内容较全
  4. mysql5.7配置_MySQL5.7详细配置教程
  5. c++ 拷贝构造函数_禁止拷贝构造,禁止bug
  6. java多线程之消费者生产者模式
  7. 数据结构实验之查找二:平衡二叉树
  8. 上科大、腾讯提出Liquid Warping GAN,实现人体动作迁移的新高度!
  9. java 单个session过期_session过期的三种方法
  10. 西南科技大学OJ题 平衡二叉树的判定1077
  11. C++中的五种构造函数
  12. JavaScript实现语音助手核心代码
  13. kafka生产者实例配置参数
  14. php选择手机相片,头像直接从手机图库选择或者拍照上传
  15. 【视频编码】ffmpeg压缩视频文件
  16. UICollectionView 实现专辑封面视差滚动
  17. 福州大学计算机考研调剂,2014福州大学计算机考研调剂复试纪实
  18. 关于微信小程序开发里,数据动态绑定,显示改变,值不改变的记录
  19. 第二章:02数据重构
  20. Qt 槽机制:public slots 和 private slots

热门文章

  1. #######好好好好##########知识图谱商业应用
  2. 计算机毕业设计选题推荐 -计算机专业毕业设计题目参考大全
  3. 安装LuaRocks
  4. JAVA 使用SSH/springboot集成 CXF框架发布Webservice
  5. graphpad做单因素方差分析_Graphpad做单因素方差分析步骤详解
  6. “LED+智能”在公路隧道照明的应用研究
  7. 嵌入式软件工程师面试遇到的经典题目
  8. 牛津高阶字典ld2_(离线)英语词典软件推荐
  9. 一键清空服务器文件,一键清理操作系统垃圾文件的BAT
  10. 4399ATAPI讲解操作事件篇