android学习教程--文件下载

一、    知识概要

1、         使用Http协议下载文件

2、         将下载的文件写入SD卡

二、    知识详解

首先创建一个Activity_download的android项目,在src中一共有三个文件,分别是

a、ivity_download.java(它是一个activity,在此中得到一个下载lrc文件的按钮和一个下载mp3文件的按钮,并为此些按钮添加监听器,在监听器的方法中调用下载类,并传入要下载文件的网络地址,如:http://10.10.16.97:8080/MP3/a1.lrc

 

package com.wyt.Activity_download;
import com.wyt.utils.HttpDownloader;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Activity_download extends Activity { 
    // 创建控件对象
    private Button TextButton = null;
    private Button MP3Button = null; 
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main); 
       // 通过ID找到控件
       TextButton = (Button) findViewById(R.id.TextButton);
       MP3Button = (Button) findViewById(R.id.MP3Button);
        // 绑定监听器
       TextButton.setOnClickListener(new TextButtonListener());
       MP3Button.setOnClickListener(new MP3ButtonListener());
    }
    // 文本文件下载监听器
    class TextButtonListener implements OnClickListener {
       public void onClick(View v) {
           // TODO Auto-generated method stub
           HttpDownloader httpDownloader = new HttpDownloader();
           String lrc = httpDownloader
                  .download("http://10.10.16.97:8080/MP3/a1.lrc");
           System.out.println(lrc);
       }
    }
    // MP3文件下载监听器
    class MP3ButtonListener implements OnClickListener {
       public void onClick(View v) {
           // TODO Auto-generated method stub
           HttpDownloader httpDownloader = new HttpDownloader();
           int mp3 = httpDownloader.downFile(
                 "http://10.10.16.97:8080/MP3/a1.mp3", "MP3/", "a1");
           System.out.println(mp3);
       }
    }
}

 

b、FileUtils.java(主要是用来在SD卡上创建存储设备的目录,创建文件,判断目录是否存在,将读到的数据写入到SD卡上去,这个类中主要涉及到的都是IO流中的知识)

 

package com.wyt.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;

    

    private String getSDPATH(){

       return SDPATH;

    }

    

    public FileUtils(){

       //得到当前外部存储设备的目录

       SDPATH=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 writeSD(String path,String fileName,InputStream input){

       File file = null;

       OutputStream output = null;

       try{

           //调用创建SD卡目录方法

           createSDDir(path);

           //调用创建SD卡文件的方法

           file = createSDFile(path+fileName);

           //创建文件输出流对象

           output = new FileOutputStream(file);

           //4个字节的读取

           byte buffer[] = new byte[4*1024];

           //当文件的内容不为空的时候就停止输出

           while(input.read(buffer)!=-1){

              output.write(buffer);

           }

           output.flush();

       }catch(Exception e){

           e.getMessage();

       }finally{

           try {

              output.close();

           } catch (IOException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

       return file;

    }

}

 

c、HttpDownloader.java(这个类就是教你如何下载文件,首先第一步是创建URL对象,然后是创建HTTP连接,接着是读取数据;这个类中我创建了下载两种不同格式的文件,一个是文本文件,一个是任意格式的文件,在下载这两种文件的时候,都会使用到下载文件的3个步骤,所以我就把这3个步骤封装到一个方法里,然后去直接调用就OK了。)

 

package com.wyt.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下载文件,前提是这个文件是文本文件,函数的返回值是文件中的内容

    public String download(String urlStr) {

       StringBuffer sb = new StringBuffer();

       String line = null;

       BufferedReader br = null;

       try {

           // 使用IO流读取数据

           br = new BufferedReader(new InputStreamReader(getUrl(urlStr)));

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

              // 将这些字符添加到缓冲区的末端

              sb.append(line);

           }

 

           // 关闭流

           br.close();

       } catch (MalformedURLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return sb.toString();

    }

 

    // 下载任意格式的文件

    //1是文件已经存在,-1是文件下载失败,0是下载成功

    public int downFile(String urlStr, String path, String fileName) {

       InputStream inputStream = null;

       FileUtils fileUtils = new FileUtils();

       if ((fileUtils.isFileExist(path + fileName))) {

           return 1;

       } else {

           try {

              inputStream = getUrl(urlStr);

              File resultFile = fileUtils

                     .writeSD(path, fileName, inputStream);

              if (resultFile == null) {

                  return -1;

              }

           } catch (MalformedURLException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           } catch (IOException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           } finally {

              try {

                  inputStream.close();

              } catch (IOException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }

           }

       }

       return 0;

    }

 

    // 封装下载的3个步骤的方法

    public InputStream getUrl(String urlStr) throws MalformedURLException,

           IOException {

       // 创建url

       url = new URL(urlStr);

       // 创建http

       HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

       // 读取数据

       InputStream inputStream = urlConn.getInputStream();

       return inputStream;

    }

}

 

三、    学习感想

1、         在此学习当中,我遇到了nullpointeException异常,我检查了好久都不知道到底是哪错了,找百大哥也于事无补,后来我突然想到java的一个基础知识点,项目中不允许有中文文件名,但是当时我的lrc文件和Mp3文件的文件名都是中文的,改之后就运行成功了。由此可见,java基础是多么重要啊,或许一个很小的错误会浪费你许多时间,而偏偏这个错误又是可以避免的,所以好好学习java基础吧!!

2、         在学习这个知识点的时候,我发现有好多地方都用到了IO流,还记得老师以前就说话,java中的IO流比较重要,在此就体现出来了,所以对这个还不怎么掌握的朋友就好好补习咯!具我所知,有些同学认为学习android,java基础不好也行,但我认为NO WAY,因为android是基于java的开发,没有java基础的同学去学习android是几乎不怎么可能的,所以要想学好android必定要先掌握,熟练,精通JAVA。