转自 http://blog.csdn.net/zzp_403184692/article/details/8160739

 一、文件下载 

Android开发中,有时需要从网上下载一些资源以供用户使用,Android API中已经提供了很多直接可以用的类供大家使用,一般文件下载需要通过三个步骤:

1.创建一个HttpURLConnection对象:

  1. // 创建一个URL对象,urlStr指的是网络IP地址
  2. url = new URL(urlStr);
  3. // 创建一个HttpURLConnection连接
  4. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

2.获得一个InputStream对象:

  1. InputStream input=null;
  2. input=urlConn.getInputStream();

3.设置访问网络的权限:

  1. //在AndroidManifest.xml配置文件中加入权限信息
  2. <uses-permission android:name="android.permission.INTERNET"/>

二、访问并写入SD卡

由于手机内存有限,所以一般需要将资料放入大容量容器SD卡中,不同手机SD卡所在目录不一样,这就需要咱们通过一个统一的函数找到SD卡所在的目录,再对它进行操作,Android中提供了一个函数,可以查找到基本上所有类型型号的手机SD卡所在的目录:

  1. //得到当前设备SD卡的目录
  2. Environment.getExternalStorageDirectory();

在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:

  1. //在AndroidManifest.xml配置文件中加入权限信息
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用:

  1. public class FileUtils {
  2. private String SDPATH;
  3. public String getSDPATH() {
  4. return SDPATH;
  5. }
  6. public FileUtils() {
  7. //得到当前外部存储设备的目录
  8. // /SDCARD
  9. SDPATH = Environment.getExternalStorageDirectory() + "/";
  10. }
  11. /**
  12. * 在SD卡上创建文件
  13. *
  14. * @throws IOException
  15. */
  16. public File creatSDFile(String fileName) throws IOException {
  17. File file = new File(SDPATH + fileName);
  18. file.createNewFile();
  19. return file;
  20. }
  21. /**
  22. * 在SD卡上创建目录
  23. *
  24. * @param dirName
  25. */
  26. public File creatSDDir(String dirName) {
  27. File dir = new File(SDPATH + dirName);
  28. dir.mkdir();
  29. return dir;
  30. }
  31. /**
  32. * 判断SD卡上的文件夹是否存在
  33. */
  34. public boolean isFileExist(String fileName){
  35. File file = new File(SDPATH + fileName);
  36. return file.exists();
  37. }
  38. /**
  39. * 将一个InputStream里面的数据写入到SD卡中
  40. */
  41. public File write2SDFromInput(String path,String fileName,InputStream input){
  42. File file = null;
  43. OutputStream output = null;
  44. try{
  45. creatSDDir(path);
  46. file = creatSDFile(path + fileName);
  47. output = new FileOutputStream(file);
  48. byte buffer [] = new byte[4 * 1024];
  49. while((input.read(buffer)) != -1){
  50. output.write(buffer);
  51. }
  52. output.flush();
  53. }
  54. catch(Exception e){
  55. e.printStackTrace();
  56. }
  57. finally{
  58. try{
  59. output.close();
  60. }
  61. catch(Exception e){
  62. e.printStackTrace();
  63. }
  64. }
  65. return file;
  66. }
  67. }


三、实例演示

在对以上文件下载和SD卡访问基本知识了解的基础上,下面进行举例说明:

文件下载一般有文本文件和字节文件,不同文件下载的方式不同,但是都需要通过上面所说的一般步骤,即都需要首先得到一个InputStream对象,然
后在对这个对象进行不同的操作,以下是对一个图片文件(字节文件)进行处理,我们在以上FileUtils类的基础上创建一个
HttpDownLoader类,以供文件下载时作为工具类调用:

  1. public class HttpDownloader {
  2. private URL url=null;
  3. FileUtils fileUtils=new FileUtils();
  4. public int downfile(String urlStr,String path,String fileName)
  5. {
  6. if(fileUtils.isFileExist(path+fileName))
  7. {return 1;}
  8. else{
  9. try {
  10. InputStream input=null;
  11. input = getInputStream(urlStr);
  12. File resultFile=fileUtils.write2SDFromInput(path, fileName, input);
  13. if(resultFile==null)
  14. {
  15. return -1;
  16. }
  17. } catch (IOException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. }
  21. }
  22. return 0;
  23. }
  24. //由于得到一个InputStream对象是所有文件处理前必须的操作,所以将这个操作封装成了一个方法
  25. public InputStream getInputStream(String urlStr) throws IOException
  26. {
  27. InputStream is=null;
  28. try {
  29. url=new URL(urlStr);
  30. HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
  31. is=urlConn.getInputStream();
  32. } catch (MalformedURLException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36. return is;
  37. }
  38. }

下面编写Activity文件进行文件的操作:

  1. public class MainActivity extends Activity {
  2. private Button downfile=null;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. downfile=(Button)findViewById(R.id.downfile);
  8. downfile.setOnClickListener(new View.OnClickListener() {
  9. downfile.setOnClickListener(new View.OnClickListener() {
  10. @Override
  11. public void onClick(View v) {
  12. // TODO Auto-generated method stub
  13. HttpDownloader httpDownLoader=new HttpDownloader();
  14. int result=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg", "test/", "test.jpg");
  15. if(result==0)
  16. {
  17. Toast.makeText(MainActivity.this, "下载成功!", Toast.LENGTH_SHORT).show();
  18. }
  19. else if(result==1) {
  20. Toast.makeText(MainActivity.this, "已有文件!", Toast.LENGTH_SHORT).show();
  21. }
  22. else if(result==-1){
  23. Toast.makeText(MainActivity.this, "下载失败!", Toast.LENGTH_SHORT).show();
  24. }
  25. }
  26. });
  27. }
  28. @Override
  29. public boolean onCreateOptionsMenu(Menu menu) {
  30. getMenuInflater().inflate(R.menu.activity_main, menu);
  31. return true;
  32. }
  33. }

注:在编写文件下载的IP地址时,不要用本地地址,比如:127.0.0.1,由于我在测试时用的Tomcat服务器,IP就直接用的本地地址,程序运行后一直没有报错,但是去SD卡中找文件时一直没有找到文件,最后改为电脑的IP地址后问题解决了。

上例中首先定义了一个HttpDownLoader类的对象httpdownloader,再调用该对象的downfile()方法,方法中第一个参数指的是文件下载的URL,第二个参数指的是准备存放到SD卡中的目录,第三个参数指的是文件存放的名称。

转 Android:文件下载和写入SD卡学习小结的更多相关文章

  1. Android 数据库SQLite 写入SD卡

    如果手机没有root,数据库文件是无法查看到的,不方便调试. 最好的办法是把数据库写进SD卡. 修改的地方有两处: 1.在你的helper类中把数据库文件名称 DATABASE_NAME 由原来的一个 ...

  2. Android 下载文件及写入SD卡

    Android 下载文件及写入SD卡,实例代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  3. Android从网络某个地址下载文件、写入SD卡

    首先创建一个HttpDownloader类,获取下载文件的网络地址,将文件下载下来以String流的方式返回: public String download(String urlStr){ //url ...

  4. Android数据存储之SD卡

    为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...

  5. [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...

  6. Android中播放本地SD卡中歌曲须要的加入的权限

    使用MediaPlayer播放本地Mp3文件时.须要注意的訪问路径的问题以及訪问权限的问题. 1.訪问路径:/storage/emulated/0 此路径即为手机的根路径,能够通过下载ES文件浏览器软 ...

  7. android 写文件到sd卡问题小记

    android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...

  8. Android之外部存储(SD卡)

    *手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...

  9. Android入门开发之SD卡读写操作(转)

    SD卡的读写是我们在开发android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String  sdCardRoot = Environment.getE ...

随机推荐

  1. Machine Schedule(二分图匹配之最小覆盖点,匈牙利算法)

    个人心得:二分图啥的一点都不知道,上网借鉴了下,请参考http://blog.csdn.net/thundermrbird/article/details/52231639 加上自己的了解,二分图就是 ...

  2. Windows下安装Redis服务,修改查看密码,修改端口,常用命令

    一.安装 出自:https://jingyan.baidu.com/article/0f5fb099045b056d8334ea97.html 1.要安装Redis,首先要获取安装包.Windows的 ...

  3. Nchan nginx 支持的开源消息推送模块

    1. 介绍 // 官方说明 Nchan is a scalable, flexible pub/sub server for the modern web, built as a module for ...

  4. oralce之 10046对Hash Join分析

    前两天解决了一个优化SQL的case,SQL语句如下,big_table为150G大小,small_table很小,9000多条记录,不到1M大小,hash_area_size, sort_area_ ...

  5. servlet运作机制

    最近研究zipkin,在研究客户端brave的时候,才算开始理解servlet了.    servlet只是tomcat被实例化一次:    之后每次访问其实都是对同一个servlet示例操作:所以, ...

  6. JavaFX 之窗口跳转(一)

    一.前言 笔者此处不讲JavaFX的基础API,只针对笔者工作时遇到的问题进行记录与总结. 零基础的网友可以访问 http://www.javafxchina.net/blog/docs/tutori ...

  7. 【备忘录】CentOS服务器mysql忘记root密码恢复

    mysql的root忘记,现无法操作数据库 停止mysql服务service  mysql stop 然后使用如下的参数启动mysql, --skip-grant-tables会跳过mysql的授权 ...

  8. Sublime + python2.7 + opencv (轻量级开发环境)

    工具: 1. Python2.7,安装完成 2. 相应版本的cv2.pyd,放入到…\Python27\Lib\site-packages\下 3. 下载Sublime Text 3,破解它,网上搜个 ...

  9. SQLServer中求两个字符串的交集(字符串以符号分隔)

    两个字符串,以特定符号分隔(例如‘,’号),求交集 第一种情况: declare @m varchar(100),@n varchar(100)select @m=',2,3,5,7,8,9,10,' ...

  10. linux下使用tar命令详解

    解压语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用. 主选项: c 创建新的档案文件.如果用户想备份一个目录或 ...