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。