1.主要内容

1.使用Http协议下载文件
2.将下载的文件写入SDCARD中

2.文件下载的主要步骤

创建一个HttpURLConnection对象
  HttpURLConnection  urlConn = (HttpURLConnection)url.openConnection();
url为一个URL的对象
获得一个inputStream 对象 
urlConn.getInputStream()(输入流是指向程序当中读入数据)
网络访问的权限
   android.permission.INTERNET
这个需要在Manifest中进行注册
这里演示一个程序既能进行MP3的下载又能进行文本文件的下载,它由两个按钮组成,一个下载文本文件一个下载MP3文件

3.实际操作

类的结构示意图:
第一个按钮用来下载文本文件,第二个按钮用来下载Mp3文件
文件布局的源代码如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><Button  android:id="@+id/downloadTxt"android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="下载文本文件"/>
<Button  android:id="@+id/downloadMp3"android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="下载MP3文件 "/>
</LinearLayout>

在这里我们需要创建两个包一个包中含有一个类用于下载文件

另一个包名为Utils,这个是一个工具包其中包含两个类:一个为FileUtils,另一个为HttpDownLoader
下面来深入看看其的作用是:
这个时候我们来看看HttpDownLoader这个类:
我们在这个类中定义两个函数:download
在这个类中定义一个私有的属性:   private  URL url = null;
函数的形参为要下载内容的地址
public String download(String urlStr){//在这里设置一个形参它用来保存下载的文本文件中的所有内容,它用于下载任何类型的文本文件StringBuffer sb = new StringBuffer();String line = null;BufferedReader buffer = null; //使用它可以每次读取一行文件try{//创建一个URL的对象url = new URL(urlStr);//创建一个HTTP链接HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));while((line =buffer.readLine())!= null){sb.append(line);}}catch(Exception e){e.printStackTrace();}finally{try{buffer.close();}catch(Exception e){e.printStackTrace();}}return sb.toString();}

在这里我们使用了BufferedReader可以每次读取一行

在这里我们使用

buffer = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

BufferedReader buffer = null;

这样我们可以每次都读取一行。sb对象中存储了有关的下载内容,最后作为返回值  使用HttpURLConnection 来建立连接

在这里使用了java的IO流,他使用了装饰着设计模式,urlConn存储的是网络上的资源的地址,我们通过getInputStream来建立了一条“管道”,把他所指的地址的内容导入到我们的程序中。

在这里,getInutStream的到的是字节流,这个时候通过inputStreamReader转换为字符流,再通过BuffererReader一步步的扩大。由于使用的是BufferReader所以可以一行行的读取。我们

使用了

while((line =buffer.readLine())!= null){

sb.append(line);

}

当读到文件的末尾的时候就结束.注意使用异常处理来读取。

这里使用了标准的java异常处理函数格式:

try{

....

}catch(Exception e){

...

}finally{

//Do

}

注意:1.以上方法只适用于读取文本文件,读取MP3文件还需要重写方法。

2、android是基于权限的,所以要记得在AndroidManifest.xml注册。要得到当前设备SD卡的目录我们使用:Environment.getExternalStorageDirectory(),得到外部存储设备。注意不要把目录写死

访问SD卡的权限:android.permission.WRITE_EXTERNAL_STORAGE

之后我们来看另一个类:

package grace.utils;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import android.os.Environment;public class FileUtils {private String SDPATH;public String getSDPATH(){return SDPATH;}public FileUtils(){// /SDCARDSDPATH = Environment.getExternalStorageState() + "/";}/*** 在SD卡上创建目录*/public File createSDDir(String dirName){File dir = new File(SDPATH +dirName);dir.mkdir();return dir;}/**** 在SD卡上创建文件* * @throws IOException*/public File createSDFile(String fileName) throws IOException{File file = new File(SDPATH +fileName);file.createNewFile();return file; }/*** 判断SD卡上的文件夹是否存在*/public boolean isFileExist(String fileName){File file = new File(SDPATH +fileName);return file.exists();}/*** 将一个InputStream里面的数据写入到SD卡中*/public File write2SDFromInput(String path, String fileName, InputStream input){File file = null;OutputStream output = null;try{createSDDir(path);file = createSDFile(path + fileName);output = new FileOutputStream(file);byte buffer[] = new byte[ 4*1024];while((input.read(buffer))!=-1){output.write(buffer);}output.flush();}catch(Exception e){e.printStackTrace();}finally{try{output.close();}catch(Exception e){e.printStackTrace();  }}return file;}
}

现在我们在创建一个方法,使inputStream里的数据写入到SDCARD中我们制定的地方。这是我们创建方法:

public File write2SDFromInput(String path,String fileName, InputStream input)

这个函数的第一个形参指的就是我们指定的存储路径,第二个参数指的就是文件名,inputStream实质上就是我们在HttpDownloader类当中所保存的数据。现在我们要把它写进sdcard当中。

我们创建一个file对象调用我们刚才写的方法,在创建一个outPutStream对象。

createSDDir(path);

file= createSDFile(path + fileName);

这里我们先创建一个目录再把文件保存在所指的目录当中。

 output = new FileOutputStream(file);byte buffer[] = new byte[ 4*1024];while((input.read(buffer))!=-1){output.write(buffer);}output.flush();

这里我们创建一个输出流让它对准文件,向其中写入我们要写的数据。

这里用到了一个过渡,那就是buffer,先从输入流中读入数据到一个缓冲区,在冲缓冲区中把数据读出写入到文件当中去。

要记得清空缓冲流,判断是不是有异常。

之后我们再来看HttpDownloader这个类当中的另一个方法:

         /*** 下载任意形式的文件*///第一个参数是想要下载的文件参数地址,第二个为存放的位置,第三个为你自己取的文件名public int downFile(String urlStr, String path,String fileName){InputStream inputStream = null;try{FileUtils fileUtils = new FileUtils();if(fileUtils.isFileExist(path +fileName)){return 1 ;}else{inputStream = getInputStreamFromUrl(urlStr);File  resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);if(resultFile == null){return -1;}}}catch(Exception e){e.printStackTrace();return -1;}finally{try{inputStream.close();}catch(Exception e){e.printStackTrace();}}return 0;}

这个函数我们用它来读取MP3格式的文件。这个方法的返回值是整形。该函数返回整形 -1:代表下载文件出错 ,0:代表下载文件成功 ,1:代表文件已经存在。

第一个参数是想要下载的文件参数地址也就是下载的网址,第二个为存放的位置,第三个为你自己取的文件名

publicint downFile(String urlStr, String path,String fileName)

我们用刚才写好的类来判断要下载的文件是否已经存在。

 FileUtils fileUtils = new FileUtils();if(fileUtils.isFileExist(path+fileName)){return1 ;}

如果存在返回1.

inputStream =getInputStreamFromUrl(urlStr);

File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);

要是文件不存在我们就调用getInoutStreamFromUrl方法获得想要下载的文件的网址。

private InputStream getInputStreamFromUrl(String urlStr)throws MalformedURLException,IOException {// TODO Auto-generated method stuburl = new URL(urlStr);HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();InputStream inputStream =urlConn.getInputStream();return inputStream;}
}

这个函数是我们自己写的,和刚才download函数很像。

这个时候我们来看一下HttpDownloader类的全貌:

package grace.utils;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.MalformedURLException;
import java.net.URL;public class HttpDownloader {private URL url = null;/**** 根据URL下载文件*  @param*  @return*/public String download(String urlStr){//在这里设置一个形参它用来保存下载的文本文件中的所有内容,它用于下载任何类型的文本文件StringBuffer sb = new StringBuffer();String line = null;BufferedReader buffer = null; //使用它可以每次读取一行文件try{//创建一个URL的对象url = new URL(urlStr);//创建一个HTTP链接HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));while((line =buffer.readLine())!= null){sb.append(line);}}catch(Exception e){e.printStackTrace();}finally{try{buffer.close();}catch(Exception e){e.printStackTrace();}}return sb.toString();}/*** 下载任意形式的文件*///第一个参数是想要下载的文件参数地址,第二个为存放的位置,第三个为你自己取的文件名public int downFile(String urlStr, String path,String fileName){InputStream inputStream = null;try{FileUtils fileUtils = new FileUtils();if(fileUtils.isFileExist(path +fileName)){return 1 ;}else{inputStream = getInputStreamFromUrl(urlStr);File  resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);if(resultFile == null){return -1;}}}catch(Exception e){e.printStackTrace();return -1;}finally{try{inputStream.close();}catch(Exception e){e.printStackTrace();}}return 0;}private InputStream getInputStreamFromUrl(String urlStr)throws MalformedURLException,IOException {// TODO Auto-generated method stuburl = new URL(urlStr);HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();InputStream inputStream =urlConn.getInputStream();return inputStream;}}

下面我们来看一下DownLoad这个类的实现情况:

package com.example.download01;import grace.utils.HttpDownloader;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class Download extends Activity {private Button downloadTxtButton;private Button downloadMp3Button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);downloadTxtButton = (Button)findViewById(R.id.downloadTxt);downloadMp3Button = (Button)findViewById(R.id.downloadMp3);downloadTxtButton.setOnClickListener(new DownloadTxtListener());downloadMp3Button.setOnClickListener(new DownloadMp3Listener());}class DownloadTxtListener implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubHttpDownloader httpDownloader = new HttpDownloader();String lrc = httpDownloader.download("http://192.168.1.107:8080/voa1500/a1.lrc");System.out.println(lrc);}}class DownloadMp3Listener implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubHttpDownloader httpDownloader = new HttpDownloader();int result = httpDownloader.downFile("http://192.168.1.107:8080/voa1500/a1.mp3", "voa/", "a1.mp3");System.out.println(result);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}

这样整个下载功能就已经实现了。

Android文件的下载相关推荐

  1. Android文件Apk下载变ZIP压缩包解决方案

    [root@ conf]# pwd /alidata/server/nginx/conf [root@ conf]# vi mime.typesapplication/vnd.android.pack ...

  2. Android文件下载——多线程下载

    Android文件多线程下载(二)中为了使调用更加简单,做了一个简单的封装.可以直接拷贝代码. 文章目录 1. 相关逻辑 1.1 HTTP首部信息 1.2 RandomAccessFile 1.3 编 ...

  3. android 中使用ExpandableListView控件结合服务器json文件的下载

    布局文件代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns ...

  4. Android中关于APK文件的下载、安装和卸载

    如果我们想开发一款App,而这款App的需求中有对Apk文件的下载.安装和卸载功能的话(就像豌豆荚,当然功能不会那强大,因为强大的功能背后总是一些比较NB的技术在支持),那么这篇博客还是比较适合你的. ...

  5. Android 使用URLConnection下载音频文件

    本文链接: Android 使用URLConnection下载音频文件 使用MediaPlayer播放在线音频,请参考Android MediaPlayer 播放音频 有时候我们会需要下载音频文件.这 ...

  6. 腾讯对象存储服务COS加密签名上传文件与下载文件的剖析,福利提供给所有使用Android的小伙伴们!

    在做一些用户需求的时候,公司往往需要工程师采集到更多有用的关于用户的个人信息,然后对用户群进行分析,今天我不是来分析这些的,今天我主要是说 腾讯推出的款云产品,那就是对象存储服务COS,这个产品面向所 ...

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

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

  8. android 网络mp3格式,Android 使用URLConnection下载音频文件的方法

    有时候我们会需要下载音频文件.这里提供一种思路,将在线音频文件通过流写到本地文件中. 使用URLConnection来建立连接,获取到的数据写到文件中. URLConnection建立连接后,可以获取 ...

  9. Android 访问FTP 服务器,实现文件的下载

    Android 访问FTP服务器,实现文件的下载,一个简单的Demo,下面是一些简单的代码片.如果对FTP不太了解的话,最好先去简单的了解哈 在测试的过程中,总是与服务器的连接容易断开,要考虑下与服务 ...

最新文章

  1. UCLA李婧翌:女性最不需要做的就是「怀疑自己」| 妇女节特辑
  2. CBM——IT与业务融合的重要途径
  3. c++中运算符重载方式中你易遗漏的小细节
  4. 易格斯拖链选型手册_拖链相关知识
  5. 模板类 Template Classes 以及模板类编译时的处理
  6. python单例模式继承_Python四种实现单例模式的方法
  7. latex 1图加标题_使用VsCode编译latex心得
  8. 高程(三)笔记---- 第三章
  9. node.js request get 请求怎么拿到返回的数据_从零开始用nodejs写一个简单的静态服务器
  10. 19楼网站服务器配置,简单的DNS 服务器配置
  11. 为memcached增加缓存依赖的程序实现
  12. 以正确的方式招募数据科学家!
  13. 高通针对LED应用的点阵字库解决方案 — 支持多种字号字体显示
  14. Programmer Competency Matrix
  15. RMQ----不更新点
  16. 网站XSS跨站攻击脚本语法
  17. Jackson初次学习
  18. iPhone麦田守望者》
  19. 微处理器基本功能及主要性能指标
  20. dp在约会上是什么意思_饭圈用语dp是什么梗 饭圈用语dp是什么意思

热门文章

  1. 刨根问底: Kafka 到底会不会丢数据?
  2. 35岁老码农:老板,你看我还有机会吗?
  3. 从 Servlet 入手带你看架构和框架设计的套路
  4. 深入解析Java锁机制
  5. 垂直电商架构进化之路
  6. 安利10款效率工具,打造windows超强生产力
  7. Python的设计目标
  8. Java常见数据结构以及特点、使用场景
  9. 关于网络的自动协商属性
  10. qlabel可以选中吗_QLabel-标签控件的应用