`
zqb666kkk
  • 浏览: 732625 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

多线程断点下载文件

    博客分类:
  • java
 
阅读更多
所谓多线程断点下载 :就是当某个文件下了一部分后突然断电了,或者下载程序暂停了,再次运行下载 可以继续下载,而不是重新下载 的一个执行过程。

基本模拟了迅雷下载的原理

本次功能用java实现 :

利用txt文件记录下载的状态  如果在安卓端的话 可以改成用数据库记录下载状态

本程序可以扩展为具有良好用户体验的 下载程序

package mutiDownload;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 多线程断点下载文件
 * 
 * @author Administrator
 * 
 */
public class BreakpointDoloadDemo {

	public  static int threadcount = 3;
	public  static int threadRunning = 3;
	
	
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		// 获取服务器上的文件长度,在本地创建一个和服务器上的文件一样大的临时文件
		String pathString = "http://192.168.1.84:8091/androidServer/test.mkv";
		URL url = new URL(pathString);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setConnectTimeout(5000);
		connection.setRequestMethod("GET");
		int code = connection.getResponseCode();
		if (code == 200) { // 请求成功
			int length = connection.getContentLength();
			System.out.println("文件长度:" + length);
			RandomAccessFile ref = new RandomAccessFile("test.mkv", "rwd");
			// 指定创建的临时文件的长度
			ref.setLength(length);
			ref.close();

			int blocksize = length / threadcount;
			for (int threadId = 1; threadId <= threadcount; threadId++) {
				int startIndex = (threadId - 1) * blocksize; // 线程开始位置
				int endIndex = threadId * blocksize - 1;
				if (threadId == threadcount) {
					endIndex = length;
				}
				System.out.println("线程" + threadId + "下载---" + startIndex
						+ "-->" + endIndex);
				new Downhread(threadId, startIndex, endIndex, pathString)
						.start();
				;

			}
		} else {
			System.out.println("服务器错误");
		}

	}

	/**
	 * 下载文件子线程
	 * 
	 * @author Administrator
	 * 
	 */
	public static class Downhread extends Thread {
		private int threadId;
		private int startIndex;
		private int endIndex;
		private String path;

		/**
		 * 
		 * @param threadId
		 *            线程id
		 * @param startIndex
		 *            线程下载的开始位置
		 * @param endIndex
		 * @param path
		 *            下载文件在服务器上的位置
		 */
		public Downhread(int threadId, int startIndex, int endIndex, String path) {
			super();
			this.threadId = threadId;
			this.startIndex = startIndex;
			this.endIndex = endIndex;
			this.path = path;
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			// super.run();
			try {
				
				//检查是否存在记录下载长度的文件,如果存在读取文件的数据
				File tempFile=new File(threadId+".txt");
				if(tempFile.exists()&&tempFile.length()>0){
					FileInputStream fis=new FileInputStream(tempFile);
					byte [] temp=new byte[1024];
					int leng=fis.read(temp);
					String downloadLen=new String(temp,0,leng);
					int downloadInt=Integer.parseInt(downloadLen);
					startIndex=downloadInt;	//修改下载的真实开始位置
				}
				
				
				
				
				URL url = new URL(path);
				HttpURLConnection connection = (HttpURLConnection) url
						.openConnection();
				connection.setConnectTimeout(5000);
				connection.setRequestMethod("GET");
				connection.setRequestProperty("Range", "bytes=" + startIndex
						+ "-" + endIndex);
				
				System.out.println("线程真实下载位置:" + threadId + "startIndex:" + startIndex+"-->"+endIndex);
				int code = connection.getResponseCode();
				System.out.println("code:" + code);
				// if(code==200){ //请求成功
				//
				// }
				InputStream is = connection.getInputStream();
				RandomAccessFile raf = new RandomAccessFile("test.mkv", "rwd");
				// 写文件的时候指定从哪个位置开始写
				raf.seek(startIndex);

				int len = 0;
				byte[] buffer = new byte[1024];
				int total = 0; // 已经下载的数据长度
				// File file=new File(threadId+".txt"); //作用:记录当前线程下载的数据长度

				while ((len = is.read(buffer)) != -1) {
					RandomAccessFile file = new RandomAccessFile(threadId
							+ ".txt", "rwd");
					raf.write(buffer, 0, len);
					total += len;
					//System.out.println("线程:" + threadId + "total:" + total);
					file.write(String.valueOf(total+startIndex).getBytes());	//记录下载的位置
					file.close();
				}
				is.close();
				raf.close();
				System.out.println("线程:" + threadId + "下载完毕了...");
				
//			    File delfile =new File(threadId+ ".txt");
//			    delfile.delete();	//当线程下载完毕后清除记录文件
			    
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				threadRunning--;
				
				if(threadRunning==0){	//所有线程执行完毕
					for(int i=0;i<=3;i++){
						 File file =new File(i+ ".txt");
						 file.delete();
					}
					System.out.println("文件下载完毕,删除所有记录文件");
				}
			}
		}
	}

}
1
2
分享到:
评论

相关推荐

    htp多线程断点下载文件

    "htp多线程断点下载文件"这一主题,涉及了网络编程、多线程技术和文件处理等多个知识点。 首先,HTTP(超文本传输协议)是我们浏览网页和下载文件的基础,它是应用层协议,负责客户端和服务器之间的通信。然而,...

    Java 多线程断点下载文件

    Java多线程断点下载文件是一种高效的文件下载方式,它允许在下载过程中暂停并从上次停止的地方继续,尤其适用于大文件下载。以下是实现这一功能的关键知识点: 1. **获取文件信息**: - 使用`java.net.URL`和`java...

    retrofit实现多线程断点下载,可暂停,开始

    在Android开发中,为了提供更好的用户体验,我们常常需要实现文件的多线程断点下载功能。这不仅可以提高下载速度,还能允许用户在任何时候暂停或继续下载。本篇将重点讲解如何利用Retrofit库和GreenDao数据库来实现...

    android多线程断点下载

    在Android开发中,多线程断点下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并确保下载的连续性。本文将详细介绍如何在Android中实现多线程断点下载,以及如何封装一个易于...

    Android多线程断点下载(优化)

    在Android开发中,多线程断点下载是一种常见的优化策略,尤其在处理大文件时,如应用程序、视频或音频文件的下载。这种技术允许用户在任何时间暂停下载,并在稍后从停止的地方继续,而无需重新开始。在本文中,我们...

    多线程断点下载

    多线程断点下载是一种高效的网络数据下载技术,尤其在处理大文件时,它能显著提高下载速度并允许用户在中断后从上次停止的地方继续。这个技术在Java和Android平台上得到了广泛的应用。以下是对这一技术的详细解释: ...

    Java多线程断点下载Sample

    在这个“Java多线程断点下载Sample”示例中,我们将深入探讨如何利用Java的多线程特性来实现文件的断点续传下载,并结合进度条展示下载进度。 首先,我们需要理解什么是多线程。在单线程环境中,程序的执行顺序是...

    C#实现支持断点续传多线程下载客户端工具类

    总之,C#实现的这个支持断点续传和多线程下载的Http Web客户端工具类通过定制HTTP请求、管理下载状态、协调多线程以及处理异常,为高效、可靠的文件下载提供了强大的功能。开发者可以根据自己的需求进一步定制和扩展...

    android 多线程断点下载 (ListView 模式)

    在Android开发中,多线程断点下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并保证用户体验。本教程主要聚焦于如何实现一个具有开始、暂停功能,并集成到ListView中的多...

    OKHttp多线程断点下载

    【OKHttp多线程断点下载】是一种在Android或Java应用中实现高效文件下载的方法,它结合了OKHttp网络库的优秀性能与多线程技术,以提高下载速度,并允许在下载过程中中断和恢复,避免因网络问题或其他因素导致的下载...

    多任务多线程断点下载demo

    标题“多任务多线程断点下载demo”指的是一个编程示例,它展示了如何在Android平台上实现一个功能完善的下载管理器。这个下载管理器能够同时处理多个下载任务,并且支持多线程和断点续传功能。在Android开发中,这样...

    详解Android中的多线程断点下载

    多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序“拼接”起来就构 成了完整的文件了。这样就大大提高了文件的下载...

    java多线程断点下载

    Java多线程断点下载是网络编程中一个实用的技术,尤其在处理大文件时能显著提升用户体验。在本文中,我们将深入探讨这个主题,讲解如何使用Java实现多线程和断点续传功能。 首先,我们需要理解什么是多线程。在...

    多文件多线程断点下载

    在IT领域,多文件多线程断点下载是一种常见的优化技术,尤其在处理大文件或者网络不稳定时,这种技术能够显著提升下载效率并提供更好的用户体验。以下是对这一主题的详细阐述: 多线程技术是并发编程的核心,它允许...

    一个多线程断点上传文件的功能

    用多线程实现断点上传的功能 DeleteOverThread(); #region 初始化 string backUploadStatus = dr["BACKEND_UPLOAD_STATUS"].ToString(); //是否上传成功或取消 if (backUploadStatus == Status.Upload_...

    Android多线程断点续传下载

    在Android应用开发中,实现多线程断点续传下载是一项重要的技术,它涉及到网络编程、文件操作以及并发处理等多个方面。以下将详细介绍这个主题的相关知识点。 首先,我们需要理解“多线程”。在Android系统中,为了...

    Android多线程文件夹下载及断点续传

    在Android开发中,进行大文件下载时,为了提高效率并充分利用设备资源,通常会采用多线程下载技术。此外,为了提升用户体验,断点续传功能也显得尤为重要,尤其是在网络不稳定或者用户中断下载后,可以从上次停止的...

    android 多线程断点下载及进度实时更新demo

    在Android开发中,多线程断点下载以及进度实时更新是一项重要的技术,它涉及到网络编程、文件操作和UI更新等多个方面。以下是对这个主题的详细解释: **多线程下载**: 多线程下载是为了提高文件下载速度和效率。...

Global site tag (gtag.js) - Google Analytics