- 浏览: 249155 次
- 性别:
- 来自: 湖南
最新评论
-
KANGOD:
android:overScrollMode="ne ...
去掉ScrollVIew拉到尽头时再拉的阴影效果 -
yangsongjing:
comsci 写道非常感谢.....希望大家的代码和文档都能够 ...
java DES 加密解密 算法 -
comsci:
非常感谢.....
希望大家的代码和文档都能够用一种简单的方 ...
java DES 加密解密 算法 -
yangsongjing:
不过2.3以下的版本没这个方法怎么解决啊?
去掉android scrollview滚动到顶部继续滚会出现一个渐变的颜色块 -
yangsongjing:
setOverScrollMode(View.OVER_SCR ...
去掉android scrollview滚动到顶部继续滚会出现一个渐变的颜色块
1 :DownloadTask类:
package com.youteach.util;
import java.io.File;
import java.net.URL;
import java.net.URLConnection;
import android.os.Message;
import android.util.Log;
public class DownloadTask extends Thread {
private int blockSize, downloadSizeMore;
private int threadNum = 5;
String urlStr, threadNo, fileName;
private int fileSize, downloadedSize;
private OnDownLoadCompetionListener listener;
/**
* @param urlStr
* 下载的URL
* @param threadNum
* 下载的线程数
* @param fileName
* 文件名
*/
public DownloadTask(String urlStr, int threadNum, String fileName,
OnDownLoadCompetionListener listener) {
this.urlStr = urlStr;
this.threadNum = threadNum;
this.fileName = fileName;
this.listener = listener;
Log.i("DownloadTask-->urlStr", urlStr + "");
Log.i("DownloadTask-->fileName", fileName + "");
}
@Override
public void run() {
FileDownloadThread[] fds = new FileDownloadThread[threadNum];
try {
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
// 获取下载文件的总大小
fileSize = conn.getContentLength();
// 计算每个线程要下载的数据量
blockSize = fileSize / threadNum;
// 解决整除后百分比计算误差
downloadSizeMore = (fileSize % threadNum);
File file = new File(fileName);
for (int i = 0; i < threadNum; i++) {
// 启动线程,分别下载自己需要下载的部分
FileDownloadThread fdt = new FileDownloadThread(url, file, i
* blockSize, (i + 1) * blockSize - 1);
fdt.setName("Thread" + i);
fdt.start();
fds[i] = fdt;
}
boolean finished = false;
while (!finished) {
// 先把整除的余数搞定
downloadedSize = downloadSizeMore;
finished = true;
for (int i = 0; i < fds.length; i++) {
downloadedSize += fds[i].getDownloadSize();
if (!fds[i].isFinished()) {
finished = false;
}
}
Log.i("DownloadTask-->downloadedSize", downloadedSize + "");
Log.i("DownloadTask-->fileSize", fileSize + "");
// 更新UI
if (listener != null) {
listener.onProgress(downloadedSize, fileSize);
}
// 休息1秒后再读取下载进度
this.sleep(1000);
}
// 下载完成
if (finished) {
if (listener != null) {
listener.onCompetion();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2 下载线程类:FileDownloadThread
package com.youteach.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
/**
* @author gongchaobin
*
* android多线程下载
* 单个下载线程
*/
public class FileDownloadThread extends Thread{
private static final int BUFFER_SIZE=1024;
private URL url;
private File file;
private int startPosition;//当前线程下载的起点
private int endPosition;//当前线程下载的终点
private int curPosition;
private boolean finished=false; //用于标识当前线程是否下载完成
private int downloadSize=0;
public FileDownloadThread(URL url,File file,int startPosition,int endPosition){
this.url=url;
this.file=file;
this.startPosition=startPosition;
this.curPosition=startPosition;
this.endPosition=endPosition;
}
@Override
public void run() {
BufferedInputStream bis = null;
RandomAccessFile fos = null;
byte[] buf = new byte[BUFFER_SIZE];
URLConnection con = null;
try {
con = url.openConnection();
con.setAllowUserInteraction(true);
//设置当前线程下载的起点,终点
con.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition);
//使用java中的RandomAccessFile 对文件进行随机读写操作
fos = new RandomAccessFile(file, "rw");
//设置开始写文件的位置
fos.seek(startPosition);
bis = new BufferedInputStream(con.getInputStream());
//开始循环以流的形式读写文件
while (curPosition < endPosition) {
int len = bis.read(buf, 0, BUFFER_SIZE);
if (len == -1) {
break;
}
fos.write(buf, 0, len);
curPosition = curPosition + len;
if (curPosition > endPosition) {
downloadSize+=len - (curPosition - endPosition) + 1;
} else {
downloadSize+=len;
}
}
//下载完成设为true
this.finished = true;
bis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean isFinished(){
return finished;
}
public int getDownloadSize() {
return downloadSize;
}
}
3 接口:OnDownLoadCompetionListener
package com.youteach.util;
public interface OnDownLoadCompetionListener {
public void onProgress(int progress, int total);
public void onCompetion();
}
转自:http://user.qzone.qq.com/363669440/blog/1352163034#!app=2&via=QZ.HashRefresh&pos=1352163034
package com.youteach.util;
import java.io.File;
import java.net.URL;
import java.net.URLConnection;
import android.os.Message;
import android.util.Log;
public class DownloadTask extends Thread {
private int blockSize, downloadSizeMore;
private int threadNum = 5;
String urlStr, threadNo, fileName;
private int fileSize, downloadedSize;
private OnDownLoadCompetionListener listener;
/**
* @param urlStr
* 下载的URL
* @param threadNum
* 下载的线程数
* @param fileName
* 文件名
*/
public DownloadTask(String urlStr, int threadNum, String fileName,
OnDownLoadCompetionListener listener) {
this.urlStr = urlStr;
this.threadNum = threadNum;
this.fileName = fileName;
this.listener = listener;
Log.i("DownloadTask-->urlStr", urlStr + "");
Log.i("DownloadTask-->fileName", fileName + "");
}
@Override
public void run() {
FileDownloadThread[] fds = new FileDownloadThread[threadNum];
try {
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
// 获取下载文件的总大小
fileSize = conn.getContentLength();
// 计算每个线程要下载的数据量
blockSize = fileSize / threadNum;
// 解决整除后百分比计算误差
downloadSizeMore = (fileSize % threadNum);
File file = new File(fileName);
for (int i = 0; i < threadNum; i++) {
// 启动线程,分别下载自己需要下载的部分
FileDownloadThread fdt = new FileDownloadThread(url, file, i
* blockSize, (i + 1) * blockSize - 1);
fdt.setName("Thread" + i);
fdt.start();
fds[i] = fdt;
}
boolean finished = false;
while (!finished) {
// 先把整除的余数搞定
downloadedSize = downloadSizeMore;
finished = true;
for (int i = 0; i < fds.length; i++) {
downloadedSize += fds[i].getDownloadSize();
if (!fds[i].isFinished()) {
finished = false;
}
}
Log.i("DownloadTask-->downloadedSize", downloadedSize + "");
Log.i("DownloadTask-->fileSize", fileSize + "");
// 更新UI
if (listener != null) {
listener.onProgress(downloadedSize, fileSize);
}
// 休息1秒后再读取下载进度
this.sleep(1000);
}
// 下载完成
if (finished) {
if (listener != null) {
listener.onCompetion();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2 下载线程类:FileDownloadThread
package com.youteach.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
/**
* @author gongchaobin
*
* android多线程下载
* 单个下载线程
*/
public class FileDownloadThread extends Thread{
private static final int BUFFER_SIZE=1024;
private URL url;
private File file;
private int startPosition;//当前线程下载的起点
private int endPosition;//当前线程下载的终点
private int curPosition;
private boolean finished=false; //用于标识当前线程是否下载完成
private int downloadSize=0;
public FileDownloadThread(URL url,File file,int startPosition,int endPosition){
this.url=url;
this.file=file;
this.startPosition=startPosition;
this.curPosition=startPosition;
this.endPosition=endPosition;
}
@Override
public void run() {
BufferedInputStream bis = null;
RandomAccessFile fos = null;
byte[] buf = new byte[BUFFER_SIZE];
URLConnection con = null;
try {
con = url.openConnection();
con.setAllowUserInteraction(true);
//设置当前线程下载的起点,终点
con.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition);
//使用java中的RandomAccessFile 对文件进行随机读写操作
fos = new RandomAccessFile(file, "rw");
//设置开始写文件的位置
fos.seek(startPosition);
bis = new BufferedInputStream(con.getInputStream());
//开始循环以流的形式读写文件
while (curPosition < endPosition) {
int len = bis.read(buf, 0, BUFFER_SIZE);
if (len == -1) {
break;
}
fos.write(buf, 0, len);
curPosition = curPosition + len;
if (curPosition > endPosition) {
downloadSize+=len - (curPosition - endPosition) + 1;
} else {
downloadSize+=len;
}
}
//下载完成设为true
this.finished = true;
bis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean isFinished(){
return finished;
}
public int getDownloadSize() {
return downloadSize;
}
}
3 接口:OnDownLoadCompetionListener
package com.youteach.util;
public interface OnDownLoadCompetionListener {
public void onProgress(int progress, int total);
public void onCompetion();
}
转自:http://user.qzone.qq.com/363669440/blog/1352163034#!app=2&via=QZ.HashRefresh&pos=1352163034
发表评论
-
ios公司账号申请流程记录
2020-08-04 17:04 3601.注册APPLE ID 2.填写公司信息,申请邓白氏码(企业 ... -
阿里百川HotFix接入指南
2017-04-11 14:46 1561阿里百川HotFix接入指南 1.首先需要成为阿里开放平台的开 ... -
安卓应用每次从后台切换到前台都会启动欢迎界面的问题
2016-07-15 09:18 2810问题描述: 应用安装后,通过安装界面的打开按钮打开应用,每当应 ... -
android性能分析工具整理
2016-03-28 22:57 723原文链接:http://www.jians ... -
android 技术经验归纳
2016-03-28 22:54 5221.android基于java,java的抽象封装要会用,并且 ... -
android面试提问
2015-11-16 11:54 0一。登录过程中需要取消登录 怎么中断连接 1)如果用httpc ... -
android 手机判断是否在充电 如断电自动打电话提醒功能
2015-05-18 11:14 3330public class MainActivity exten ... -
ANDROID应用安全防御
2015-04-02 10:06 1282Android应用的安全隐患包括三个方面:代码安全、数据安全和 ... -
Fragment加入Pagerview效果
2015-04-01 14:50 495转自 http://www.eoeandroid.com/t ... -
设计模式记忆方法(转)
2015-03-11 10:20 871设计模式的分类 创建型。 情景记忆:两个人在聊天。 ... -
android 数据库版本升级
2015-03-03 16:41 741数据库升级的意义 我 ... -
java 23种设计模式示例代码集合
2015-02-09 09:40 714策略模式,建造者模式,简单工厂模式,单例模式,抽象工厂模式 ... -
ios本地数据存储
2014-08-22 16:21 831在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题 ... -
ios 学习笔记3(界面的跳转和按钮事件等)
2014-08-21 16:50 15791.ios的很多应用程序都是采用多视图设计,控制器类型4种 ... -
iOS 学习笔记2(http get 登录)
2014-08-21 11:49 609// // ViewController.m // ... -
ios 学习笔记1
2014-08-21 11:48 856每个应用程序都有属于自己的UIWindow,UIWindow ... -
oc笔记6(NSNumber/NSValue/NSNull)
2014-08-20 18:04 857NSNumber: // 将int类型的10包装成一个NS ... -
oc笔记5(字典)
2014-08-20 17:23 766NSDictionary 通过唯一的key找到唯 ... -
oc笔记4(NSArray)
2014-08-20 15:41 14821.NSArray *array = [NSArray a ... -
oc笔记3(NSMutableString)
2014-08-20 14:54 7461.创建一个可变字符串 NSMutableString * ...
相关推荐
"多线程断点续传工具类"通常指的是一个Java类,该类设计用于实现文件传输时的多线程功能,并且能够从上次中断的地方继续下载或上传,这在大文件传输中非常有用,因为它可以提高速度并避免因网络问题导致的传输失败。...
本篇将详细讲解如何构建一个Android断点续传工具类,以及相关的核心知识点。 1. **断点续传原理**: 断点续传主要依赖于服务器支持和客户端的存储。客户端在下载过程中记录已下载的文件大小,当再次启动下载时,向...
局域网断点续传工具是一种专为解决在局域网环境下进行大文件传输时遇到的问题而设计的应用软件。在不稳定的网络环境中,比如无线局域网,由于信号波动、网络中断等因素,大文件的复制过程可能会频繁中断,导致用户...
本示例"java大文件分块上传断点续传demo"提供了一个完整的解决方案,它允许用户将大文件分块上传,并在上传过程中支持断点续传。 首先,理解"分块上传"的概念。分块上传是将一个大文件分割成多个小块,然后逐个上传...
Java断点续传技术在实际应用中广泛用于文件上传和下载工具,如迅雷、FTP客户端等,它有效地解决了大文件传输过程中的网络问题,提高了用户体验。了解并掌握这种技术对于开发高效的网络应用至关重要。
Android 多线程可断点续传上传文件至服务器Demo(Android端编辑器:Android Studio,服务器端编辑器:Eclipse,请注意手机默认下载目录必须要有t007.zip,服务器端必须有D:\temp\temp目录)
本知识点主要聚焦于一个名为"HttpTools"的单文件工具类,它提供了对HTTP GET、POST方法的支持,并且具备断点续传和多线程断点续传的功能。这个工具类的实现,可以帮助开发者在处理大文件下载或上传时提高性能和用户...
在C#编程中,实现一个支持断点续传和多线程下载的HTTP Web客户端工具类是一项复杂但实用的任务。断点续传允许用户在下载过程中中断,然后在稍后的时间点继续下载,而不会丢失已下载的数据。多线程下载则能显著提高大...
在这个"QT学习之文件传输和断点续传"的主题中,我们将深入探讨如何在QT环境中实现基于TCP的文件传输功能,并且特别关注断点续传技术。 首先,让我们了解TCP(Transmission Control Protocol)协议。TCP是一种面向...
Android SDK提供了一些工具类,如`DownloadManager`,可以方便地实现断点续传。`DownloadManager`是一个系统服务,可以管理多个下载任务,自动处理网络变化和设备重启等复杂情况。通过设置`Request`对象的`...
《深入理解FastDFS断点续传机制》 在IT领域,文件存储系统是不可或缺的一部分,FastDFS作为一款轻量级的分布式文件系统,因其高效、稳定、易用的特点,被广泛应用在很多项目中。其中,断点续传功能是FastDFS在大...
断点续传是一种非常实用的技术,尤其在处理大文件下载时,允许用户中断并重新启动下载,而无需从头开始。 首先,我们需要了解HTTP协议的基本概念。HTTP(超文本传输协议)是用于在Web上传输数据的标准协议。在下载...
1. **Apache Commons IO库**:Apache Commons IO库提供了一些有用的工具类,例如`FileUtils`,可以帮助处理文件的读写和比较,这对于断点续传非常有用。 2. **NIO (New IO)**:Java的NIO提供了非阻塞的I/O操作,...
服务器端收到这个请求后,如果支持断点续传,会在响应中返回`206 Partial Content`状态码,并在`Content-Range`响应头中包含完整的文件范围和当前传输的字节范围。例如,`Content-Range: bytes 5MB-10MB/20MB`表示总...
断点续传常用于下载工具(如迅雷、BitTorrent)和云存储服务(如百度网盘),提高大文件传输的效率和可靠性。在实际开发中,需要考虑错误处理、安全性和性能优化,例如检查文件一致性、防止数据损坏、减少网络延迟...
通过上述知识点的实现,`iPhoneFTP`项目为iOS开发者提供了一个实用的FTP客户端工具,特别是对于需要断点续传功能的应用,如大型文件下载或更新。开发者可以研究这个源代码,学习如何在自己的应用中集成这样的功能。
下载码和断点续传是网络下载领域中的关键技术,它们对于提高下载效率和用户体验具有重要意义。断点续传功能允许用户在下载过程中中断后,从上次停止的地方继续下载,而无需重新开始,这对于大文件下载尤其有用。下面...
在这个上下文中,这个类可能包含了处理Plupload上传过程中的一些逻辑,比如处理断点续传的状态和数据。 **moxie.js和plupload.js** 这两个JavaScript文件是Plupload的核心组件。`moxie.js`是前面提到的Moxie库,它...
基于Java的的文件图片上传-分片上传-断点续传-秒传java源码.zip 1.主要功能经测试支持IE9以上,Chrome,FireFox;其他浏览器未测试; 2.文件上传部分:主要实现了文件的上传,进度条,多文件一起上传,上传前删除,...
Java中的`RandomAccessFile`类提供了一种方式,可以定位到文件中的任意位置,这对于实现断点续传非常有用。 4. **多线程传输**:为了提高传输效率,可以使用多个线程同时传输文件的不同部分。这需要将文件分割成多...