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协议的文件下载是一个常见的需求,主要涉及到网络编程、多线程以及文件操作等技术。下面将详细讲解这个过程,并结合提供的文件名称列表来解析实现的关键点。 1. **Http协议**:HTTP...
本文将深入探讨如何在Android中实现这个功能,主要围绕标题“Android利用Http下载文件”和提供的博客链接进行讲解。 首先,我们需要理解Http协议的基本原理。Http(超文本传输协议)是一种应用层协议,用于从Web...
这个“安卓http协议使用程序”显然利用了HTTP协议来实现网络图片的下载功能,使得用户可以在安卓设备上浏览并保存互联网上的图片资源。在本文中,我们将深入探讨如何在安卓2.0及以上版本中实现这一功能,以及涉及的...
本资源“安卓文件下载上传解压相关-android断点下载杀进程或关Activity继续下载保证下载速度.rar”主要关注的是如何在Android环境中实现高效的文件下载,即使在进程被杀死或者Activity被关闭的情况下也能继续下载,...
Android 使用 FTP 方式实现文件上传和下载 Android 使用 FTP 方式实现文件上传和下载是移动应用开发中的一项重要功能,特别是在 OTA 在线升级项目中,文件上传和下载是一个关键步骤。下面就 Android 使用 FTP 方式...
在本案例中,我们将讨论如何在Android JNI中使用libcurl库来执行HTTP请求和文件下载。 libcurl是一个流行的开源库,用于处理各种网络协议,包括HTTP、HTTPS等。它提供了丰富的API,可以在多种编程语言中使用,包括C...
本文将深入探讨如何使用C语言来实现一个基于HTTP协议的文件下载功能,以及它在资源占用和效率上的优势。 HTTP协议是应用层的一个标准协议,主要用于Web浏览器和服务器之间的数据交换。在文件下载场景中,客户端...
在Android平台上进行文件的下载、上传以及解压是移动应用开发中的常见操作。在这个场景中,我们关注的是如何从Android设备向一个运行.NET服务的服务器上传文件,以及服务器端如何处理这些文件。以下是对这个主题的...
这个压缩包"安卓文件下载上传解压相关-Android多线程断点继传下载工具库---帮你搞定下载功能.rar"显然提供了一个针对Android平台的多线程、断点续传下载工具库,旨在帮助开发者更轻松地实现高效且可靠的文件下载功能...
在Android平台上,将网页内容通过HTTP协议下载到指定文件夹是一项常见的任务,尤其在离线浏览、数据缓存或者后台更新资源的场景中。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,它允许客户端(如...
本篇将详细讲解如何在Android应用中使用Socket进行文件的上传和下载操作。 首先,理解Socket的基本概念:Socket是应用程序与网络协议之间的接口,它允许两个网络应用程序通过TCP/IP协议进行通信。在Android中,我们...
在Android开发中,为了提升用户...总的来说,Android中使用HTTP协议实现多线程断点下载,需要对HTTP协议、线程管理、文件操作和错误处理有深入理解。通过合理的设计和实现,可以有效地提高大文件下载的效率和用户体验。
本文将深入探讨SMB协议以及基于该协议开发的安卓文件管理器APP的相关知识点。 一、SMB协议详解 1. SMB协议的历史:SMB最初由IBM在1980年代开发,后来微软在Windows NT中将其标准化,成为Windows网络文件共享的基础...
本项目“安卓文件下载上传解压相关-android单线程多任务断点排队下载支持多界面刷新.rar”旨在提供一个实现这些功能的示例,虽然无法一一验证所有代码的可用性,但可以作为学习和参考的基础。 1. **单线程多任务...
本文将详细讲解如何实现一个Android应用,利用TCP协议从PC服务器下载文件到Android设备。 首先,理解TCP(Transmission Control Protocol)是网络传输层的一个协议,提供了面向连接的、可靠的数据传输服务。在...
在Android平台上,访问和下载SMB(Server Message Block)服务器上的资源是一项常见任务,尤其是在企业环境中,SMB常用于共享文件和数据。SMB是一种网络文件系统协议,它允许网络上的计算机共享文件、打印机和其他...
本案例将深入探讨如何在Android应用中通过自定义协议实现文件的断点上传功能。 首先,我们需要理解自定义协议的概念。自定义协议是在HTTP、FTP等标准协议基础上扩展的通信方式,通常用于满足特定需求。在Android中...
在Android应用中,我们通常使用HTTP协议来获取网页数据、下载文件或者发送用户数据到服务器。 首先,"java_http_get"文件可能包含了一个关于HTTP GET请求的示例。GET请求是最基本的HTTP请求方法,用于请求服务器...
本文将详细讲解如何使用HTTP协议在Android客户端实现文件上传,并涉及服务器端的相关设置。 首先,我们需要了解HTTP协议。HTTP(超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是互联网...
在Android应用开发中,网络通信是一项基础且重要的功能,尤其在数据交换、文件上传和下载等方面。本案例主要探讨如何利用HTTP协议在Android环境中实现文件上传。HTTP(超文本传输协议)是互联网上应用最广泛的一种...