Android之文件下载

来源:互联网 发布:adobe ae cc 2015 mac 编辑:程序博客网 时间:2024/04/28 08:45

在手机上下载一些文件是很常见的,比如下载一本书,下载一首Mp3等等,下面就来通过一个实例来简单介绍一下文件的下载。

文件下载实现的基本步骤:创建一个HttpURLConnection对象,获得一个InputStream对象,设置网络访问权限。

在这个实例中实现歌词和歌曲MP3的下载。

首先我们先看一下布局文件,很简单,只有两个Button控件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <Button         android:id="@+id/downloadText"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="downloadText"/>    <Button         android:id="@+id/downloadMp3"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="downloadMp3"/>    </LinearLayout>

下载文件需要用到两个utils工具类,一个工具类(HttpDownloader.java)是用来下载文件用的,另一个(FileUtils.java)是用来将下载的文件写入到SD卡中:

/Download/src/cn/android/sword/utils/HttpDownloader.java

package cn.android.sword.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;import android.util.Log;public class HttpDownloader {private final static String SWORD="SWORD";public String download(String urlStr){URL url = null;StringBuffer sb = new StringBuffer();String line = null;BufferedReader buffer = null;try {//创建一个URL对象url = new URL(urlStr);//创建一个Http连接HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();//使用IO流读取数据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 (IOException e) {e.printStackTrace();}}return sb.toString();}//返回-1下载文件失败,返回0下载成功,返回1则是文件已存在public int downFile(String urlStr,String path,String fileName){InputStream inputStream = null;FileUtils fileUtils = new FileUtils();if(fileUtils.isFileExist(fileName)){return 1;}else{try {inputStream = getInputSteamFromUrl(urlStr);} catch (IOException e) {e.printStackTrace();return -1;}File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);if(resultFile == null){return -1;}}try {inputStream.close();} catch (IOException e) {e.printStackTrace();}return 0;}private InputStream getInputSteamFromUrl(String urlStr) throws MalformedURLException, IOException {URL url = null;url = new URL(urlStr);HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();InputStream inputStream = urlConn.getInputStream();return inputStream;}}


/Download/src/cn/android/sword/utils/FileUtils.java

package cn.android.sword.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.getExternalStorageDirectory()+"/";}/* * 在SD卡上创建文件 */public File createSDFile(String fileName) throws IOException{File file = new File(SDPATH+fileName);file.createNewFile();return file;}/* * 在SD卡上创建目录 */public File createSDDir(String dirName){File dir = new File(SDPATH+dirName);dir.mkdir();return dir;}/* * 判断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 (IOException e) {e.printStackTrace();}finally{try {//关闭输出流output.close();} catch (IOException e) {e.printStackTrace();}}return file;}}
在Activity中:
/Download/src/cn/android/sword/download/DownloadActivity.java

package cn.android.sword.download;import cn.android.sword.utils.HttpDownloader;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/* 文件下载的步骤:1:创建一个Ht't'p'URLConnection对象:HttpURLConnection urlConn = (HttpURLConnection)url.o'penConnection;2:获得一个InputStream对象:urlConn.getInputStream();3:设置网络访问权限:android.permissior.INTERNET;访问SD卡步骤:得到当前设备SD卡的目录;Environment.getExternalStorageDirectory();访问SD卡的权限:android:permission.WRITE_EXTERNAL_STORAGE */public class DownloadActivity extends Activity implements OnClickListener{private final static String SWORD="SWORD";     //声明两个按钮控件Button downloadText;    Button downloadMp3;    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        findViews();    }    //根据Id得到控件private void findViews() {downloadText = (Button) this.findViewById(R.id.downloadText);downloadMp3 = (Button) this.findViewById(R.id.downloadMp3);//添加监听事件downloadText.setOnClickListener(this);downloadMp3.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.downloadText:HttpDownloader httpDownloader = new HttpDownloader();//所要下载文件的url路径String lrc = httpDownloader.download("http://192.168.1.101:8080/20111021/a.lrc");//日志打印输出Log.i(SWORD,""+lrc);break;case R.id.downloadMp3:HttpDownloader httpDownloader1 = new HttpDownloader();int result = httpDownloader1.downFile("http://192.168.1.101:8080/20111021/m.mp3","dir/","new.mp3");Log.i(SWORD,""+result);break;default:Log.i(SWORD,"ERROR");break;}}}

本例子所下载的歌词文件和MP3文件均为我的pc上的tomcat中项目下的文件,所以需要启动我的tomcat service服务,在虚拟机上运行:


点击downloadText,查看控制台日志输出:

可以看到乱码的文件内容,然后点击downloadMp3,在SD卡的dir目录下我们能看到一个new.mp3的文件,这说明我们的文件下载成功了。

原创粉丝点击