`

java版多线程下载

    博客分类:
  • java
阅读更多

只是记录一下,java多线程下载,没有断点续传,

其实可以加,只是今天没有精力了,

 

思路就是,每次下载一段之后保存下进度,下次启动的时候读一下进度就可以了。

 

package com.hung.main;

import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;

public class Main {

	private static boolean ISDEBUG = false;
	private static int ThreadCound = 3;

	public static void main(String[] args) throws ClientProtocolException,
			IOException {
		String path = "http://192.168.1.162:8081/test.exe";

		HttpClient hc = HttpClientBuilder.create().build();
		HttpGet hg = new HttpGet(path);
		HttpResponse hr = hc.execute(hg);
		int stauts = hr.getStatusLine().getStatusCode();
		if (200 != stauts) {
			System.out.println("请求失败,状态码:" + stauts);
			return;
		}

		long length = hr.getEntity().getContentLength();
		RandomAccessFile raf = new RandomAccessFile("test.exe", "rwd");
		raf.setLength(length);

		raf.close();

		long blockSize = length / ThreadCound;

		System.out.println("总长度:" + length + " 块长度: " + blockSize);

		for (int i = 1; i <= ThreadCound; i++) {
			long starIndex = (i - 1) * blockSize;
			long endIndex = i * blockSize - 1;
			if (i == ThreadCound) {
				// 从0开始,所以结尾应该是总长度 -1
				endIndex = length - 1;
			}
			new MyThread(path, starIndex, endIndex).start();

		}

	}

	private static class MyThread extends Thread {
		private String url;
		private long start;
		private long end;
		private String threadName;

		public MyThread(String url, long start, long end) {
			this.url = url;
			this.start = start;
			this.end = end;
			if(ISDEBUG){
				System.out.println("下载范围:" + start + " ~ " + end);
			}
		}

		@Override
		public void run() {
			threadName = Thread.currentThread().getName();
			try {
				RandomAccessFile raf = new RandomAccessFile("test.exe", "rwd");

				HttpClient hc = HttpClientBuilder.create().build();
				HttpGet hg = new HttpGet(url);
				hg.setHeader("Range", "bytes=" + start + "-" + end);
				HttpResponse hr = hc.execute(hg);

				int status = hr.getStatusLine().getStatusCode();
				if (status < 200 || 299 < status) {
					System.out.println(threadName + " 请求失败");
					return;
				}
				if (ISDEBUG) {
					String s1 = threadName + "状态码:" + status;
					System.out.println(s1);
					long l = hr.getEntity().getContentLength();
					String s2 = threadName + "内容长度:" + l;
					System.out.println(s2);
				}
				InputStream is = hr.getEntity().getContent();
				raf.seek(start);
				int i = 0;
				long total = 0;
				byte[] bs = new byte[1024 * 8];
				while ((i = is.read(bs)) != -1) {
					raf.write(bs, 0, i);
					total += i;
					// System.out.println(Thread.currentThread().getName()
					// +" 下载进度 : " + total);
				}

				raf.close();
				is.close();
				System.out.println(threadName + " 下载完成");
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
	}
}

 

分享到:
评论

相关推荐

    Java多线程下载器

    Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个部分并同时下载,显著提高了下载速度。在Java中实现多线程下载器涉及许多关键概念和技术,包括线程、并发控制、网络I/O...

    java多线程下载器

    Java多线程下载器是一种利用Java编程语言实现的高效文件下载工具,它通过将大文件分割成多个小部分,然后创建多个线程同时下载这些部分,以提高下载速度。这种技术在处理大文件或者网络带宽有限的情况下尤其有用,...

    java实现多线程下载

    2. **Java多线程实现**: - 实现方式一:继承`Thread`类。创建一个新的类,继承自`Thread`,重写`run()`方法,然后创建该类的实例并调用`start()`方法启动线程。 - 实现方式二:实现`Runnable`接口。创建一个类,...

    java多线程简单下载器

    【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...

    java http多线程下载器

    Java HTTP多线程下载器是一种优化的网络资源下载工具,它利用Java编程语言实现了HTTP协议的下载功能,并结合多线程技术以提高下载速度。在本文中,我们将深入探讨Java HTTP多线程下载器的工作原理、核心概念以及实现...

    Java多线程下载

    Java多线程下载技术是Java开发中用于提升大文件下载效率的一种常见方法。在传统的单线程下载过程中,网络请求可能会因为各种原因中断,如网络波动、服务器问题或用户操作等,这会导致需要从头开始下载,浪费时间和...

    (Java)FTP多线程下载源代码

    采用apache commons开发包,实现了FTP多线程下载,并有简单的包括进度条的界面,代码的运行:1 把自己的PC配置成FTP服务器(只需下载Serc-U软件)2 建立用户,用户名:zhangyu,密码:123,设置根目录,并拷贝进一些...

    java实现多线程下载文件

    在Java编程中,多线程下载文件是一种优化大文件下载速度和效率的技术。它通过将一个大文件分割成多个小部分,然后同时启动多个线程分别下载这些部分,从而达到加速下载的效果。以下是对这个主题的详细解释: 1. **...

    java 多线程下载 (单文件)

    Java多线程下载技术主要应用于提高大文件下载的效率,通过将文件分割成多个部分,同时启动多个线程分别下载这些部分,从而实现并行下载,加快下载速度。以下是对这个主题的详细解释: 1. **Java多线程基础**: 在...

    java多线程下载源代码

    Java多线程下载是利用Java编程语言实现的一种高效下载大文件的技术。在传统的单线程下载方式中,如果网络环境不稳定或文件较大,下载过程可能会很慢,甚至中断。而多线程下载则是将文件分割成多个部分,每个部分由一...

    Java实现多线程下载源代码

    总的来说,这个项目是一个很好的实践示例,它不仅展示了Java多线程编程的基本概念,还结合了图形用户界面的设计,帮助初学者理解和掌握这两个重要的编程技能。通过分析和运行这个源代码,开发者不仅可以学习到多线程...

    java多线程下载图片

    在这个场景中,"java多线程下载图片"意味着我们将探讨如何使用Java来实现一个能够异步下载多个图片的系统。 首先,我们需要理解Java中的线程是如何创建和运行的。Java提供了两种创建线程的方式:继承Thread类和实现...

    Java实现的多线程下载工具

    Java实现的多线程下载工具是一种利用Java编程语言来提高文件下载效率的技术。在传统的单线程下载方式中,文件的下载过程由一个线程执行,可能会受到网络波动、服务器响应速度等因素的影响,导致下载速度慢且不稳定。...

    Java多线程文件下载

    Java多线程文件下载是一种高效的下载策略,它通过将大文件分割成多个部分,然后创建多个线程分别下载这些部分,来实现并行下载。这种技术可以显著提高下载速度,尤其是在网络条件不稳定或者带宽有限的情况下。下面...

    java多线程下载文件

    本文将深入解析Java多线程下载文件的关键技术和实现细节。 #### 一、Java多线程下载原理 多线程下载的核心思想是将一个大文件分割成多个小的部分,每个部分由一个独立的线程进行下载,最后将这些部分合并成完整的...

    JAVA多线程端点续传下载

    JAVA多线程端点续传下载JAVA多线程端点续传下载JAVA多线程端点续传下载JAVA多线程端点续传下载JAVA多线程端点续传下载JAVA多线程端点续传下载JAVA多线程端点续传下载JAVA多线程端点续传下载JAVA多线程端点续传下载...

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

Global site tag (gtag.js) - Google Analytics