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="下载文件"/>
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" />但原因至今尚未查明,各位路过的大牛如明白一二,还望相告,不胜感激。
- Android开发之文件下载和getInputStream()空指针的解决办法。
- Android开发中setOnclicklistener抛出空指针的解决办法
- android 4.0 HttpURLConnection. getInputStream() 为空的问题
- conn.getInputStream 显示为空指针
- android asynHttp下载PDF文件时报空指针
- Android错误之setAdapter(adapter)空指针nullPointer 解决办法
- ServletRequest中getReader()和getInputStream()只能调用一次的解决办法
- 新建android项目兼容v4包出错和解决办法,带有可下载的空项目
- Android中关于空指针异常的解决办法
- Android开发之文件下载
- android 开发之文件下载
- Android开发之文件下载
- android 开发之文件下载
- Android开发之文件下载
- Android 开发中的空指针
- Android 文件下载中文名乱码的解决办法
- Android 文件下载中文名乱码的解决办法
- Android 4.0 HttpUrlConnection的getInputStream()方法总是返回空的问题
- sql 语句 容易忘记的一些东西
- 面向接口编程详解(二)
- XMemcached使用
- shell script 计算两个整数乘积 取余
- Github上更新自己Fork的代码
- Android开发之文件下载和getInputStream()空指针的解决办法。
- 今天开始
- 客户端接收不到servlet返回数据
- Android休眠唤醒驱动流程
- 颜色值对应表
- android 随手记--读取sd卡txt文件
- XCode Codesnipet pl0,pl1,pl2,pl3,pl4
- 你要看透的56条人生哲理
- linux sort 命令详解