`
zhenping
  • 浏览: 83627 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Android文件下载使用Http协议

阅读更多

Android文件下载做法和JAVA的网络编程差不多,我没有使用第三方插件、方法。做的比较粗糙,高手绕道哈。

JAVA code

 

package cn.qiuzhping.study;

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

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class DownloadStudy extends Activity {
	private Button btn_download1 = null;
	private Button btn_download2 = null;

	/**
	 * @项目名称:study
	 * @类名称:HttpDownloder
	 * @作者:Qiuzhping
	 * @时间:2013-12-29下午11:04:11
	 * @作用 :根据Http协议下载文件
	 */
	public class HttpDownloader {
		private URL url = null;

		/**
		 * @方法名: download
		 * @作者:Qiuzhping
		 * @作用: 根据网络路径 下载文本文件
		 * @返回值类型: String
		 */
		public String download(String urlStr) {
			StringBuffer sb = new StringBuffer();
			String line = null;
			BufferedReader bufferReader = null;
			try {
				url = new URL(urlStr);
				HttpURLConnection urlConn = (HttpURLConnection) url
						.openConnection();
				bufferReader = new BufferedReader(new InputStreamReader(
						urlConn.getInputStream()));// BufferedReader
													// 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
				while ((line = bufferReader.readLine()) != null) {// 按行读取文本
					sb.append(line);
				}
			} catch (Exception e) {
				e.printStackTrace();
				Log.w("download", "文本文件下载异常!!!");
			} finally {
				try {
					if (bufferReader != null)
						bufferReader.close();
				} catch (IOException e) {
					e.printStackTrace();
					Log.w("download", "bufferReader关闭异常!!!");
				}
			}
			return sb.toString();
		}

		/**
		 * @方法名: download
		 * @作者:Qiuzhping
		 * @作用: 下载非文本文件
		 * @返回值类型: int -1:下载失败 0: 下载成功 1:文件存在
		 */
		public int download(String urlStr, String parentName, String fileName) {
			InputStream in = null;
			FileUtil fileUtil = new FileUtil();
			if (fileUtil.isFileExist(parentName + fileName))// 文件已经存在
				return 1;
			else {
				in = getInputStreamFromUrl(urlStr);
				File file = fileUtil.write2fromIn(parentName, fileName, in);
				try {
					if (in != null)
						in.close();
				} catch (IOException e) {
					e.printStackTrace();
					Log.i("download", "输入流in关闭异常!!!!");
				}
				if (file == null)
					return -1;
			}
			return 0;
		}

		/**
		 * @方法名: getInputStreamFromUrl
		 * @作者:Qiuzhping
		 * @作用: 获取网络输入流
		 * @返回值类型: InputStream
		 */
		public InputStream getInputStreamFromUrl(String urlStr) {
			InputStream in = null;
			try {
				url = new URL(urlStr);
				HttpURLConnection urlConn = (HttpURLConnection) url
						.openConnection();
				in = urlConn.getInputStream();
			} catch (MalformedURLException e) {
				e.printStackTrace();
				Log.w("getInputStreamFromUrl", "初始化url失败!!");
			} catch (IOException e) {
				e.printStackTrace();
				Log.w("getInputStreamFromUrl", "openConnection失败!!");
			}
			return in;
		}
	}

	/**
	 * @项目名称:study
	 * @类名称:FileUtil
	 * @作者:Qiuzhping
	 * @时间:2013-12-30上午10:57:12
	 * @作用 :创建外部存储文件路径为/PATH/packageName/fileName
	 */
	public class FileUtil {
		private final String cmd = "cat /proc/mounts";
		private final String format = "sdcard";
		private final String sdCard = Environment.getExternalStorageDirectory()
				.getAbsolutePath();

		private String PATH = null;

		public String getExternlSD() {
			File file = Environment.getExternalStorageDirectory();
			File[] files = file.getParentFile().listFiles();
			for (int i = 0; i < files.length; i++) {
				Log.i("getExternlSD", files[i].getPath());
			}

			return null;
		}

		/**
		 * @方法名: getExternalPath
		 * @作者:Qiuzhping
		 * @作用: 获取真正的External sdcard路径
		 * @返回值类型: String
		 */
		public String getExternalPath() {
			BufferedReader read = null;
			String external_SDCard = sdCard;
			Runtime runtime = Runtime.getRuntime();
			try {
				Process process = runtime.exec(cmd);
				read = new BufferedReader(new InputStreamReader(
						process.getInputStream()));
				String line;
				while ((line = read.readLine()) != null) {
					if (line.toLowerCase().contains(format)) {
						String[] array = line.split(" ");
						if (array != null && array.length >= 5) {
							String temp = array[1].replace("/.android_secure",
									"");
							if (!sdCard.equals(temp)) {
								external_SDCard = temp;
							}
						}
					}
				}
			} catch (Exception e) {
				external_SDCard = sdCard;
				e.printStackTrace();
			}
			return external_SDCard;
		}

		/**
		 * @方法名: getPath
		 * @作者:Qiuzhping
		 * @作用: 获取包名
		 * @返回值类型: String
		 */
		public String getPath() {
			return PATH;
		}

		/**
		 * 默认是在SD卡上创建文件
		 */
		public FileUtil() {
			/*
			 * if (Environment.getExternalStorageState().equals(
			 * Environment.MEDIA_MOUNTED)) { // 得到当前外部存储器的PATH 就是SDCard Path
			 * PATH = Environment.getExternalStorageState() + "/"
			 * +this.getClass().getPackage().getName() + "/"; }
			 */
			Log.i("FileUtil", this.getClass().getPackage().getName());
			PATH = getExternalPath();
			// PATH += this.getClass().getPackage().getName() + "/";
			getExternlSD();
		}

		/**
		 * @方法名: createFile
		 * @作者:Qiuzhping
		 * @作用: 创建文件
		 * @返回值类型: File
		 */
		public File createFile(String parentName, String fileName) {
			String packName = this.getClass().getName();
			File dir = createDirFile(packName + "/" + parentName);
			File file = new File(dir.getPath() + "/" + fileName);
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
				Log.w("createFile", file.getPath() + "创建异常!!!");
			}
			Log.w("createFile", file.getPath() + "创建成功!!!");
			return file;
		}

		/**
		 * @方法名: createDirFile
		 * @作者:Qiuzhping
		 * @作用: 创建目录
		 * @返回值类型: File
		 */
		public File createDirFile(String dir) {
			File dirFile = new File(PATH + "/" + dir);
			dirFile.mkdirs();// 路径长使用mkdirs();
			Log.i("createDirFile", dirFile.getPath() + "创建成功!!!");
			return dirFile;
		}

		/**
		 * @方法名: isFileExist
		 * @作者:Qiuzhping
		 * @作用: 判断文件是否存在
		 * @返回值类型: boolean 如果由 filename 指定的文件或目录存在则返回 TRUE,否则返回 FALSE
		 */
		public boolean isFileExist(String fileName) {
			File dirFile = new File(PATH + "/" + fileName);
			return dirFile.exists();

		}

		/**
		 * @方法名: write2fromIuput
		 * @作者:Qiuzhping
		 * @作用: 根据提供的上一级目录parentName和fileName文件名字、二进制输入流in创建文件
		 * @返回值类型: File
		 */
		public File write2fromIn(String parentName, String fileName,
				InputStream in) {
			File file = null;
			OutputStream out = null;
			try {

				file = createFile(parentName, fileName);// 创建文件
				out = new FileOutputStream(file);
				byte[] buffer = new byte[4 * 1024];// 每次缓存4个字节
				while ((in.read(buffer)) != -1) {
					out.write(buffer);
				}
				out.flush();// 刷新输出流
			} catch (Exception e) {
				e.printStackTrace();
				Log.w("write2fromIuput", "文件创建异常!!");
			} finally {
				try {
					if (out != null)
						out.close();
				} catch (IOException e) {
					e.printStackTrace();
					Log.w("write2fromIuput", "关闭输出流异常!!!");
				}
			}
			return file;
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.download_study);
		btn_download1 = (Button) findViewById(R.id.btn_download1);
		btn_download1.setOnClickListener(new Btn_download1());

		btn_download2 = (Button) findViewById(R.id.btn_download2);
		btn_download2.setOnClickListener(new Btn_download2());
	}

	Runnable downloadRun = new Runnable() {//Android 4.0要使用线程访问网络,否则将会出现警告
		@Override
		public void run() {
			HttpDownloader downloader = new HttpDownloader();
			Log.i("Btn_download1",
					downloader.download("http://10.0.0.91:8080/ems/down.txt"));
			Log.i("Btn_download1",
					"状态 = "
							+ downloader
									.download(
											"http://10.0.0.91:8080/ems/antlr-2.7.6.jar",
											"jsp", "antlr-2.7.6.jar"));
		}
	};

	class Btn_download1 implements OnClickListener {
		@Override
		public void onClick(View arg0) {
			new Thread(downloadRun).start();
		}

	}

	class Btn_download2 implements OnClickListener {
		@Override
		public void onClick(View arg0) {
			new Thread(downloadRun).start();
			// HttpDownloader downloader = new HttpDownloader();
			// Log.i("Btn_download1",
			// "状态 = "
			// + downloader.download(
			// "http://10.0.0.91:8080/ems/index.jsp",
			// "jsp", "index.jsp"));
		}

	}
}


xml

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".SQLiteStudy" >

    <Button
        android:id="@+id/btn_download1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="下载文本" />

    <Button
        android:id="@+id/btn_download2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_download1"
        android:text="下载其他" />

</RelativeLayout>



分享到:
评论

相关推荐

    Android实现基于Http协议的文件下载

    在Android开发中,基于Http协议的文件下载是一个常见的需求,主要涉及到网络编程、多线程以及文件操作等技术。下面将详细讲解这个过程,并结合提供的文件名称列表来解析实现的关键点。 1. **Http协议**:HTTP...

    Android利用Http下载文件

    本文将深入探讨如何在Android中实现这个功能,主要围绕标题“Android利用Http下载文件”和提供的博客链接进行讲解。 首先,我们需要理解Http协议的基本原理。Http(超文本传输协议)是一种应用层协议,用于从Web...

    安卓http协议使用程序

    这个“安卓http协议使用程序”显然利用了HTTP协议来实现网络图片的下载功能,使得用户可以在安卓设备上浏览并保存互联网上的图片资源。在本文中,我们将深入探讨如何在安卓2.0及以上版本中实现这一功能,以及涉及的...

    安卓文件下载上传解压相关-android断点下载杀进程或关Activity继续下载保证下载速度.rar

    本资源“安卓文件下载上传解压相关-android断点下载杀进程或关Activity继续下载保证下载速度.rar”主要关注的是如何在Android环境中实现高效的文件下载,即使在进程被杀死或者Activity被关闭的情况下也能继续下载,...

    Android使用ftp方式实现文件上传和下载

    Android 使用 FTP 方式实现文件上传和下载 Android 使用 FTP 方式实现文件上传和下载是移动应用开发中的一项重要功能,特别是在 OTA 在线升级项目中,文件上传和下载是一个关键步骤。下面就 Android 使用 FTP 方式...

    android jni使用curl进行http请求和文件下载

    在本案例中,我们将讨论如何在Android JNI中使用libcurl库来执行HTTP请求和文件下载。 libcurl是一个流行的开源库,用于处理各种网络协议,包括HTTP、HTTPS等。它提供了丰富的API,可以在多种编程语言中使用,包括C...

    采用http协议实现文件下载功能源代码

    本文将深入探讨如何使用C语言来实现一个基于HTTP协议的文件下载功能,以及它在资源占用和效率上的优势。 HTTP协议是应用层的一个标准协议,主要用于Web浏览器和服务器之间的数据交换。在文件下载场景中,客户端...

    安卓文件下载上传解压相关-Android上传文件到.net服务器服务器使用webservice.rar

    在Android平台上进行文件的下载、上传以及解压是移动应用开发中的常见操作。在这个场景中,我们关注的是如何从Android设备向一个运行.NET服务的服务器上传文件,以及服务器端如何处理这些文件。以下是对这个主题的...

    安卓文件下载上传解压相关-Android多线程断点继传下载工具库---帮你搞定下载功能.rar

    这个压缩包"安卓文件下载上传解压相关-Android多线程断点继传下载工具库---帮你搞定下载功能.rar"显然提供了一个针对Android平台的多线程、断点续传下载工具库,旨在帮助开发者更轻松地实现高效且可靠的文件下载功能...

    android利用http协议把网页内容下载到指定文件夹

    在Android平台上,将网页内容通过HTTP协议下载到指定文件夹是一项常见的任务,尤其在离线浏览、数据缓存或者后台更新资源的场景中。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,它允许客户端(如...

    android使用socket上传、下载文件

    本篇将详细讲解如何在Android应用中使用Socket进行文件的上传和下载操作。 首先,理解Socket的基本概念:Socket是应用程序与网络协议之间的接口,它允许两个网络应用程序通过TCP/IP协议进行通信。在Android中,我们...

    Android中使用HTTP协议实现多线程断点下载案例

    在Android开发中,为了提升用户...总的来说,Android中使用HTTP协议实现多线程断点下载,需要对HTTP协议、线程管理、文件操作和错误处理有深入理解。通过合理的设计和实现,可以有效地提高大文件下载的效率和用户体验。

    SMB协议 文件管理器APP

    本文将深入探讨SMB协议以及基于该协议开发的安卓文件管理器APP的相关知识点。 一、SMB协议详解 1. SMB协议的历史:SMB最初由IBM在1980年代开发,后来微软在Windows NT中将其标准化,成为Windows网络文件共享的基础...

    安卓文件下载上传解压相关-android单线程多任务断点排队下载支持多界面刷新.rar

    本项目“安卓文件下载上传解压相关-android单线程多任务断点排队下载支持多界面刷新.rar”旨在提供一个实现这些功能的示例,虽然无法一一验证所有代码的可用性,但可以作为学习和参考的基础。 1. **单线程多任务...

    Android TCP文件下载

    本文将详细讲解如何实现一个Android应用,利用TCP协议从PC服务器下载文件到Android设备。 首先,理解TCP(Transmission Control Protocol)是网络传输层的一个协议,提供了面向连接的、可靠的数据传输服务。在...

    Android读取SMB服务器资源或者下载资源文件

    在Android平台上,访问和下载SMB(Server Message Block)服务器上的资源是一项常见任务,尤其是在企业环境中,SMB常用于共享文件和数据。SMB是一种网络文件系统协议,它允许网络上的计算机共享文件、打印机和其他...

    Android中使用自定义协议实现文件断点上传案例

    本案例将深入探讨如何在Android应用中通过自定义协议实现文件的断点上传功能。 首先,我们需要理解自定义协议的概念。自定义协议是在HTTP、FTP等标准协议基础上扩展的通信方式,通常用于满足特定需求。在Android中...

    老罗Android视频开发教程 android之http协议编程代码

    在Android应用中,我们通常使用HTTP协议来获取网页数据、下载文件或者发送用户数据到服务器。 首先,"java_http_get"文件可能包含了一个关于HTTP GET请求的示例。GET请求是最基本的HTTP请求方法,用于请求服务器...

    android通过HTTP协议上传文件至远程服务器

    本文将详细讲解如何使用HTTP协议在Android客户端实现文件上传,并涉及服务器端的相关设置。 首先,我们需要了解HTTP协议。HTTP(超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是互联网...

    Android中通过HTTP协议实现网络通信文件上传案例

    在Android应用开发中,网络通信是一项基础且重要的功能,尤其在数据交换、文件上传和下载等方面。本案例主要探讨如何利用HTTP协议在Android环境中实现文件上传。HTTP(超文本传输协议)是互联网上应用最广泛的一种...

Global site tag (gtag.js) - Google Analytics