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文件工具类
项目中添加该工具类,用一下语句调用 FTPUtil ftpUtil = new FTPUtil("172.16.1.41",21,"admin","123456"); ftpUtil.downLoadFile("20190913.txt","D:\\ftplocal\\20190913.txt"); ftpUtil.uploadFile&#...
以下是对"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开发中用于便捷处理文件上传下载任务的关键组件,`UploadUtils.java`类包含了核心的上传下载方法,配合使用说明文档,可以方便地在项目中实现高效且安全的文件传输功能。...
健壮性:在异常处理方面,工具类充分考虑了网络不稳定、文件不存在、权限不足等各种可能的问题场景,确保在遇到问题时能够给出清晰的错误提示并尽可能地自我恢复。 可读性:代码有全面的注释,方便易读。
java 文件上传工具类 java 文件上传工具类java 文件上传工具类 java 文件上传工具类java 文件上传工具类 java 文件上传工具类java 文件上传工具类 java 文件上传工具类java 文件上传工具类 java 文件上传工具类java ...
"C++文件操作工具类"是一个专门为C++开发者设计的实用工具,它简化了对文件进行读写、创建、删除等操作的过程。 首先,我们要理解C++中的文件操作基本概念。C++通过标准库中的`fstream`头文件提供了一套接口,允许...
java 文件类型工具类 java 文件类型工具类java 文件类型工具类 java 文件类型工具类java 文件类型工具类 java 文件类型工具类java 文件类型工具类 java 文件类型工具类java 文件类型工具类 java 文件类型工具类java ...
本文将详细介绍一个名为“视频下载工具类”的工具,它具备多线程下载和断点续传功能。 首先,我们要理解什么是多线程下载。在传统的单线程下载中,数据是从服务器一次性连续获取的,这限制了下载速度,特别是在网络...
文件操作工具类,包含生成保存,复制,删除,读取,获取文件名,获取文件列表等等,只有你想不到,没有你找不到的Android端工具类,复制到项目中可直接使用
FTP上传下载工具类通常是指一个编程接口或代码库,为开发者提供便捷的FTP客户端功能,包括连接到FTP服务器、上传文件、下载文件以及管理远程目录等操作。 在开发中,我们可能遇到以下关键知识点: 1. FTP基本概念...
6.[工具类] 使用Java程序来实现HTTP文件的队列下载 .java 7.[工具类] 文件操作工具类 .java 8.[工具类] 序列化保存为XML文件的工具类 .java 9.[工具类] 验证码img .jsp 10.[工具类] 中文验证.jsp ......... 等等20几...
[工具类] 使用Java程序来实现HTTP文件的队列下载 .java [工具类] 文件操作工具类 .java [工具类] 序列化保存为XML文件的工具类 .java [工具类] 一个压缩工具类 .java [工具类] 用java编写简单UDP网络通信程序 ....