`
bwlcool
  • 浏览: 20406 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

下载文件工具类

阅读更多

public class DownloadUtils {
	private static final int CONNECT_TIMEOUT = 10000;
	private static final int DATA_TIMEOUT = 40000;
	private final static int DATA_BUFFER = 1024 * 10;

	public interface DownloadListener {
		public void downloading(int progress);

		public void downloaded();
	}

	public static long download(String urlStr, File dest, boolean append,
			DownloadListener downloadListener) throws Exception {
		LogUtil.i("开始下载:" + urlStr);
		int downloadProgress = 0;
		long remoteSize = 0;
		long currentSize = 0;
		long totalSize = -1;

		File parentFile = dest.getParentFile();
		if (parentFile != null && !parentFile.exists()) {
			parentFile.mkdirs();
		}

		if (!append || !dest.isFile()) {
			dest.delete();
		}

		if (append && dest.exists()) {
			currentSize = dest.length();
		}

		HttpGet request = new HttpGet(urlStr);

		LogUtil.d("currentSize = " + currentSize);

		if (currentSize > 0) {
			request.addHeader("Range", "bytes=" + currentSize + "-");
		}

		HttpParams params = new BasicHttpParams();
		HttpConnectionParams.setConnectionTimeout(params, CONNECT_TIMEOUT);
		HttpConnectionParams.setSoTimeout(params, DATA_TIMEOUT);
		HttpClient httpClient = new DefaultHttpClient(params);

		InputStream is = null;
		FileOutputStream os = null;
		try {
			HttpResponse response = httpClient.execute(request);
			int statusCode = response.getStatusLine().getStatusCode();
			LogUtil.d("statusCode = " + statusCode);
			if (statusCode == HttpStatus.SC_OK|| statusCode == HttpStatus.SC_PARTIAL_CONTENT) {

				boolean isBreak = false;
				if (statusCode == HttpStatus.SC_PARTIAL_CONTENT) {
					isBreak = true;
				}
				Header[] hs = response.getAllHeaders();
				if (hs != null) {
					for (int i = 0; i < hs.length; i++) {
						String headerName = hs[i].getName();
						if ("Accept-Ranges".equalsIgnoreCase(headerName)
								|| "Accept-Range".equalsIgnoreCase(headerName)
								|| "Content-Ranges"
										.equalsIgnoreCase(headerName)
								|| "Content-Range".equalsIgnoreCase(headerName)) {
							isBreak = true;
						}
					}
				}

				remoteSize = response.getEntity().getContentLength(); // max
				LogUtil.d("old remoteSize = " + remoteSize);
				if (isBreak) {
					remoteSize += currentSize;
				}
				LogUtil.d("new remoteSize = " + remoteSize);

				is = response.getEntity().getContent();
				Header contentEncoding = response
						.getFirstHeader("Content-Encoding");
				if (contentEncoding != null
						&& contentEncoding.getValue().equalsIgnoreCase("gzip")) {
					is = new GZIPInputStream(is);
				}
				os = new FileOutputStream(dest, isBreak);
				byte buffer[] = new byte[DATA_BUFFER];
				int readSize = 0;
				while ((readSize = is.read(buffer)) != -1) {
					os.write(buffer, 0, readSize);
					os.flush();
					totalSize += readSize;
					currentSize += readSize;
					downloadProgress = (int) (currentSize * 100 / remoteSize);
					// LogUtil.d("currentSize = " + currentSize);
					if (downloadListener != null) {
						downloadListener.downloading(downloadProgress);
					}
					if (Thread.currentThread().isInterrupted()) {
						LogUtil.i("取消下载:" + urlStr);
						break;
					}
				}
				if (totalSize < 0) {
					totalSize = 0;
				}
				LogUtil.d("currentSize = " + currentSize);
			} else {
				throw new Exception("网络请求失败:" + urlStr);
			}

		} catch (Exception e) {
			throw e;
		} finally {
			httpClient.getConnectionManager().shutdown();
			if (os != null) {
				try {
					os.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
			if (is != null) {
				try {
					is.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
		}

		if (totalSize < 0) {
			throw new Exception("Download file fail: " + urlStr);
		}

		if (downloadListener != null) {
			downloadListener.downloaded();
		}

		return totalSize;
	}
}

分享到:
评论

相关推荐

    Java文件工具类

    Java文件工具类

    ftp上传下载文件工具类

    项目中添加该工具类,用一下语句调用 FTPUtil ftpUtil = new FTPUtil("172.16.1.41",21,"admin","123456"); ftpUtil.downLoadFile&#40;"20190913.txt","D:\\ftplocal\\20190913.txt"&#41;; ftpUtil.uploadFile&#...

    java文件上传下载工具类

    以下是对"java文件上传下载工具类"这一主题的详细解释。 首先,让我们了解文件上传。在Web应用中,用户可能需要上传文件,如图片、文档或视频。Java通过Servlet API提供了处理文件上传的功能。Servlet 3.0及以上...

    java文件下载工具类,可以下载文件

    java文件下载工具类,可以下载文件

    java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类

    java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件上传工具类java 文件...

    java 文件处理工具类 java 文件处理工具类java 文件处理工具类java 文件处理工具类

    java 文件处理工具类 java 文件处理工具类java 文件处理工具类java 文件处理工具类java 文件处理工具类 java 文件处理工具类java 文件处理工具类java 文件处理工具类java 文件处理工具类 java 文件处理工具类java ...

    java 操作文件工具类 java 操作文件工具类

    java 操作文件工具类java 操作文件工具类 java 操作文件工具类java 操作文件工具类java 操作文件工具类 java 操作文件工具类java 操作文件工具类java 操作文件工具类 java 操作文件工具类java 操作文件工具类java ...

    上传下载工具类java

    总结,`上传下载工具类java`是Java开发中用于便捷处理文件上传下载任务的关键组件,`UploadUtils.java`类包含了核心的上传下载方法,配合使用说明文档,可以方便地在项目中实现高效且安全的文件传输功能。...

    java 文件上传工具类 java 文件上传工具类

    java 文件上传工具类 java 文件上传工具类java 文件上传工具类 java 文件上传工具类java 文件上传工具类 java 文件上传工具类java 文件上传工具类 java 文件上传工具类java 文件上传工具类 java 文件上传工具类java ...

    C++文件操作工具类

    "C++文件操作工具类"是一个专门为C++开发者设计的实用工具,它简化了对文件进行读写、创建、删除等操作的过程。 首先,我们要理解C++中的文件操作基本概念。C++通过标准库中的`fstream`头文件提供了一套接口,允许...

    java 文件类型工具类 java 文件类型工具类

    java 文件类型工具类 java 文件类型工具类java 文件类型工具类 java 文件类型工具类java 文件类型工具类 java 文件类型工具类java 文件类型工具类 java 文件类型工具类java 文件类型工具类 java 文件类型工具类java ...

    视频下载工具类

    本文将详细介绍一个名为“视频下载工具类”的工具,它具备多线程下载和断点续传功能。 首先,我们要理解什么是多线程下载。在传统的单线程下载中,数据是从服务器一次性连续获取的,这限制了下载速度,特别是在网络...

    Android文件操作工具类

    文件操作工具类,包含生成保存,复制,删除,读取,获取文件名,获取文件列表等等,只有你想不到,没有你找不到的Android端工具类,复制到项目中可直接使用

    Excel POI 工具类

    1. **读取Excel文件**:工具类可能包含一个静态方法,接受文件路径或InputStream作为参数,返回一个工作簿对象,这样开发者可以方便地遍历工作表和单元格。 2. **写入Excel文件**:创建新的工作簿,添加工作表,...

    ftp上传下载工具类

    FTP上传下载工具类通常是指一个编程接口或代码库,为开发者提供便捷的FTP客户端功能,包括连接到FTP服务器、上传文件、下载文件以及管理远程目录等操作。 在开发中,我们可能遇到以下关键知识点: 1. FTP基本概念...

    图片下载工具类

    综上所述,"图片下载工具类"涉及了Android开发中的网络请求、多线程、内存管理、文件操作、图片处理等多个核心领域,是一个功能完备且高效的组件,对于任何需要展示网络图片的应用都是不可或缺的。

    Java使用NFS实现上传、下载、读取文件工具类

    健壮性:在异常处理方面,工具类充分考虑了网络不稳定、文件不存在、权限不足等各种可能的问题场景,确保在遇到问题时能够给出清晰的错误提示并尽可能地自我恢复。 可读性:代码有全面的注释,方便易读。

    Java开发常用Util工具类

    字符串工具类/数据类型转换类/集合工具类/数组工具类/Properties文件操作类/常用流操作工具类/编码工具类/Json工具类/日期工具类/下载文件工具类/解压ZIP工具类/文件编码转码

Global site tag (gtag.js) - Google Analytics