Android开发之文件下载和getInputStream()空指针的解决办法。

来源:互联网 发布:房源采集的中介软件 编辑:程序博客网 时间:2024/05/16 05:56

Android文件下载的实现,其实很简单,在网上能够查到很多的资料,实现起来非常容易。
首先布局文件:

    <Button android:id="@+id/downloadTxt"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="下载文本类型文件"/>        <Button android:id="@+id/downloadFile"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="下载文件"/>


工具类FileUtils.java和HttpDownloader.java

import java.io.File;import java.io.FileNotFoundException;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 (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {output.close();} catch (IOException e) {e.printStackTrace();}}return file;}}
import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;public class HttpDownloader {private URL url = null;/** * 根据URL下载文件,前提是这个文件当中的内容是文本,函数返回值就是文件中的内容 * 1.创建一个URL对象 * 2.通过URL对象,创建一个HttpURLConnection对象 * 3.得到InputStream * 4.从InputStream当中读取数据 */public String download(String urlStr){StringBuffer sb = new StringBuffer();String line = null;BufferedReader buffer = null;try {//创建一个URL对象url = new URL(urlStr);//得到一个HttpURLConnection对象HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();//urlConn.connect();//使用IO流读取数据buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));while ((line = buffer.readLine()) != null) {sb.append(line);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException 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;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 (IOException e) {e.printStackTrace();}}return 0;}public InputStream getInputStreamFromUrl(String urlStr)throws MalformedURLException, IOException {url = new URL(urlStr);HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();InputStream inputStream = urlConn.getInputStream();return inputStream;}}
Activity文件:

import com.example.utils.HttpDownloader;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class Download extends Activity {private Button downTxtButton = null;private Button downFileButton = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);downTxtButton = (Button) findViewById(R.id.downloadTxt);downFileButton = (Button) findViewById(R.id.downloadFile);downTxtButton.setOnClickListener(new downTxtListener());downFileButton.setOnClickListener(new downFileListener());}class downTxtListener implements OnClickListener{@Overridepublic void onClick(View v) {HttpDownloader httpDownloader = new HttpDownloader();String lrc = httpDownloader.download("http://www.xxx.com/a.txt");//此处填写文本文件的url地址System.out.println(lrc);Toast.makeText(Download.this, lrc, Toast.LENGTH_SHORT).show();}}class downFileListener implements OnClickListener{@Overridepublic void onClick(View v) {HttpDownloader httpDownloader = new HttpDownloader();int result = httpDownloader.downFile("http://....", "hao/", "a1.jpg");//此处填写文件的url地址System.out.println(result);String resultStr = "";if(result == -1){resultStr = "下载失败";} else if(result == 1) {resultStr = "下载的文件已存在";} else {resultStr = "下载成功";}Toast.makeText(Download.this, resultStr, Toast.LENGTH_SHORT).show();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.download, menu);return true;}}

以上是代码的实现,但是还要授予这个项目的网络访问权限和sdcard的读写权限。在AndroidManifest.xml文件里面加入这两行代码:

<uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

在模拟器上跑起来后就能在LogCat里面看到打印出来的信息

不过有些工程会报getInputStream()空指针的错误,困扰了我很久,无意间在网上查到只要把android:targetSdkVersion删除便可解决问题。

<uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="16" />
但原因至今尚未查明,各位路过的大牛如明白一二,还望相告,不胜感激。


原创粉丝点击