Android文件下载

在写Android下载文件功能时,在这中间与到了一些问题。在刚写好代码测试时报空指针异常。一开始是因为在AndroidManifest.xml中忘了写访问INTERNET权限:<uses-permission android:name="android.permission.INTERNET"/>。

最后写了还是不行。在网上查了很多资料,注意到了下载文件与网络连接有关,因为我用的是3G无线网卡。后来终于找到了原因,因为我是在启动Android模拟器后才连接无线网的,所以此时的模拟器是没有检测到网络,Android模拟器上也没有显示3G信号标志。最后,我先连接无线网,然后再启动Android模拟器,模拟器上有了3G信号标志。这时下载文件就成功了

以下为代码:

DownloadUtils类,调用此类方法下载文件。



package tumeng.utils;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


import android.util.Log;




public class DownloadUtils {
public String download(String urlStr) {
System.out.println("---------------->download");
StringBuffer sb = new StringBuffer();
BufferedReader bReader=null;
String line = null;
try {
URL url = new URL(urlStr);
System.out.println("1");
HttpURLConnection urlConnection = (HttpURLConnection)url
.openConnection();
System.out.println("2");
urlConnection.setConnectTimeout(20000);
urlConnection.setRequestMethod("GET");
//urlConnection.connect();
System.out.println("3");
int in = urlConnection.getResponseCode();
System.out.println("in----------->:"+in);
InputStream inputStream = urlConnection.getInputStream();
System.out.println("4");
bReader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println("5");
while ((line = bReader.readLine()) != null) {
sb.append(line);
System.out.println("------------>line " + line);
}
} catch (Exception e) {
e.printStackTrace();
Log.d("myDeBug", "下载异常");
}finally{
try {
bReader.close();
} catch (IOException e) {
e.printStackTrace();
Log.d("myDeBug", "下载异常");
}
}
return sb.toString();
}


public String readFile(String path) {
StringBuffer sb = new StringBuffer();
BufferedReader bReader = null;
String line = null;
File file = null;
file = new File(path);
try {
InputStream inStr = new FileInputStream(file);
bReader = new BufferedReader(new InputStreamReader(inStr));
while ((line = bReader.readLine()) != null) {
sb.append(line);
System.out.println("======>" + line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
/**
* 下载文件
* @param url
* @param path
* @param filename
* @return -1:代表下载文件出错;0:代表下载文件成功;1代表下载文件已经存在
*/
public int download(String url,String path,String filename){
System.out.println("---------->文件名:"+path+filename);
FileUtils fileUtils = new FileUtils();
File file=null;
InputStream input = null;
try {
if(fileUtils.isFileExists(path+filename)){
return 1;
}else{
System.out.println("---------->获得输入流");
input = fileUtils.getInputStreanByURL(url);
System.out.println("---------->开始写入文件");
file = fileUtils.writeFileToSD(path, filename,input);
if(file == null){
return -1;
}
}
} catch (Exception e) {
e.printStackTrace();
return -1;
}
return 0;
}
}

FileUtils类实现文件下载功能。

/**
 * 
 */
package tumeng.utils;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


import android.os.Environment;


/**    
 * 类名称:FileUtils   
 * 1.获得创建SD卡目录
 * 2.创建文件名
 * 3.创建目录
 * 4.判断文件是否存在
 */
public class FileUtils {
private String SDPATH;


public String getSDPATH() {
return SDPATH;
}
public FileUtils(){
SDPATH = Environment.getExternalStorageDirectory()+"/";
}
/**
 * 创建文件名
 * @param filename 文件名称
 * @return
 * @throws IOException
 */
public File createFile(String filename) throws IOException{
File file = new File(SDPATH + filename);
file.createNewFile();
return file;
}
/**
 * 创建目录
 * @param dirname 目录名称
 * @return
 */
public File createDir(String dirname){
File dir = new File(SDPATH+dirname);
dir.mkdir();
return dir;
}
/**
 * 判断文件是否存在
 * @param filename
 * @return
 */
public boolean isFileExists(String filename){
File file = new File(SDPATH+filename);
return file.exists();
}
/**
 * 将下载文件写入文件中
 * @param path 写入目录
 * @param filename 写入文件名
 * @param input 待写入文件流
 * @return 换回文件类型对象
 */
public File writeFileToSD(String path,String filename,InputStream input){
File file=null;
int in = 0;
OutputStream output=null;
//在创建文件之前先创建文件目录
createDir(path);
System.out.println("---------->创建目录");
try {
System.out.println("---------->创建文件");
file = createFile(path+filename);
output = new FileOutputStream(file);
System.out.println("---------->创建写出文件对象");
byte buffer[] = new byte[1024];
System.out.println("---------->读取字节流");
while ((in = input.read(buffer))!=-1) {
System.out.println("======>读取字节数: "+in);
output.write(buffer);
}
output.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return file;
}
/**
 * 根据url获得InputStream对象
 * @param url 输入的url
 * @return
 */
public InputStream getInputStreanByURL(String url){
InputStream input=null;
try {
URL theurl = new URL(url);
HttpURLConnection con = (HttpURLConnection)theurl.openConnection();
input = con.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return input;
}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值