`
gaojingsong
  • 浏览: 1200752 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【JAVA之多线程下载文件实现】

阅读更多

1、准备待下载文件


 

2、准备下载地址


 

三、核心代码

 

/**
 * JAVA 多线程实现文件下载
 * @author gaojignsong
 *
 */
public class MultiDownload {
	public static String path = "http://localhost:8080/upload/G4Studio.pdf";// 下载文件的路径
	public static String store = "E:/C/G4.pdf";// 文件存储路径
	public static String temp = "E:/C/";// 临时文件的存储路径
	public static String method = "GET";
	public static int threadNum = 5;// 设置开启的线程数量

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HttpURLConnection connection = getConnection(path, method);
		try {
			connection.connect();// 打开连接
			if (connection.getResponseCode() == 200) {
				// 获取文件的大小
				int length = connection.getContentLength();
				System.out.println(length);
				File file = new File(store);
				// 生成临时文件
				RandomAccessFile raf = new RandomAccessFile(file, "rwd");
				// 设置临时文件的大小
				raf.setLength(length);
				int blockSize  = length / threadNum;
				for (int i = 0; i < threadNum; i++) {
					int startIndex = i * blockSize ;
					int endIndex = (i + 1) * blockSize  - 1;
					if (i == threadNum - 1)
						endIndex = length - 1;
					System.out.println("start: " + startIndex + " end: "+ endIndex);
					new DownloadThread(startIndex, endIndex, i).start();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 获取连接
	 * @param path
	 * @return
	 */
	public static HttpURLConnection getConnection(String path, String method) {
		HttpURLConnection connection = null;
		try {
			URL url = new URL(path);
			connection = (HttpURLConnection) url.openConnection();
			connection.setReadTimeout(6000);// 设置读取超时时间
			connection.setConnectTimeout(6000);// 设置连接超时时间
			connection.setRequestMethod(method);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return connection;
	}

}

class DownloadThread extends Thread {
	public int startIndex;
	public int endIndex;
	public int threadId;

	public DownloadThread(int startIndex, int endIndex, int threadId) {
		this.startIndex = startIndex;
		this.endIndex = endIndex;
		this.threadId = threadId;
	}

	@Override
	public void run() {
		//创建保存下载进度的临时文件 
		File progressFile = new File(MultiDownload.temp + threadId + ".txt");
		//如果进度临时文件存在 
		if (progressFile.exists()) {
			try {
				BufferedReader reader = new BufferedReader(new FileReader(progressFile));
				//从进度临时文件中读取出上一次下载的总进度  
                //然后与原本的开始位置相加,得到新的开始位置 
				startIndex +=  Integer.parseInt(reader.readLine());// 计算出断点需要开始下载的字节位置
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		HttpURLConnection connection = MultiDownload.getConnection(
				MultiDownload.path, MultiDownload.method);
		//设置本次http请求所请求的数据的区间 
		connection.setRequestProperty("RANGE", "bytes=" + startIndex + "-"+ endIndex);
		try {
			connection.connect();
			int code = connection.getResponseCode();
			System.out.println(code);
            
			//创建一个临时文件 ,拿到临时文件的输出流  
			RandomAccessFile randomAccessFile = new RandomAccessFile(new File(MultiDownload.store), "rw");
			//把文件的写入位置移动至startIndex 
			randomAccessFile.seek(startIndex);
			//200:请求全部资源成功  206:代表部分资源请求成功
			if (connection.getResponseCode() == 206) {
				InputStream is = connection.getInputStream();
				byte[] buffer = new byte[2048];
				int len = 0;
				int total = 0;
				while ((len = is.read(buffer)) != -1) {
					//每次读取流里数据之后,同步把数据写入临时文件 
					randomAccessFile.write(buffer, 0, len);
					total += len;
					//将执行进度写入临时文件中,生成一个专门用来记录下载进度的临时文件
					RandomAccessFile tempRaf = new RandomAccessFile(progressFile, "rwd");
					tempRaf.write((total + "").getBytes());
					tempRaf.close();
				}
			}
			// 只要线程执行到这一步的话,就已经表明他已经完成了自己应该爬取的字节范围啦,所以要删除临时文件
			progressFile.delete();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


 

四、结果验证


 

  • 大小: 106.5 KB
  • 大小: 74.2 KB
  • 大小: 80.3 KB
1
0
分享到:
评论
1 楼 masuweng 2018-03-12  
       

相关推荐

    java实现多线程下载文件

    通过以上步骤,我们可以设计并实现一个高效的多线程文件下载系统。在实际项目中,还可以考虑使用成熟的库,如Apache HttpClient或OkHttp,它们提供了对多线程下载的良好支持。同时,结合Java的并发库,可以构建出更...

    Java 利用多线程实现文件的分片下载

    刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源...在提供的`java多线程文件传输`压缩包中,可能包含了实现这些概念的示例代码,通过分析和学习,可以更好地理解多线程文件传输的原理和实践。

    Java多线程文件分片下载实现的示例代码

    Java多线程文件分片下载实现的示例代码 本文将详细介绍Java多线程文件分片下载的实现示例代码,通过示例代码,大家可以学习和理解多线程文件分片下载的技术难点和解决方案。 多线程下载的技术难点 ---------------...

    Java多线程文件下载

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

    java 多线程下载 (单文件)

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

    java多线程下载文件

    ### Java多线程断点下载文件:关键技术与实现 在当今高速互联网环境下,高效的数据传输技术变得至关重要。Java多线程断点续传文件下载技术就是一种能够显著提高下载速度和稳定性的方法。本文将深入解析Java多线程...

    Java 多线程断点下载文件

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

    SpringBoot版本的多线程下载文件,分段下载文件

    本篇将深入探讨如何利用SpringBoot实现多线程下载文件以及分段下载文件的技术。 首先,多线程下载文件是一种提高下载速度的方法,通过将大文件分成多个小部分,每个部分由一个单独的线程负责下载,从而充分利用多核...

    Java实现文件的多线程下载

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。在本案例中,我们将探讨如何...在这个案例中,不仅学习了Java多线程编程,还涉及到网络I/O、文件操作以及并发控制等多个知识点。

    java实现多线程下载

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

    java多线程URL方式下载单个大文件

    在Java编程中,多线程下载大文件是一种常见的优化策略,尤其对于网络资源如文件或图片的下载。这种策略能够利用多核处理器的优势,通过并发处理来提高下载速度。本篇将详细介绍如何使用Java实现基于URL的单个大文件...

    多线程分别下载文件

    这个"多线程分别下载文件"的Demo是针对在ListView或GridView控件中实现的一项功能,允许用户选择多个文件进行并行下载,并且每个文件的下载进度可以在对应的列表项中实时更新,提供良好的用户体验。 首先,我们要...

    java多线程文件传输

    Java多线程文件传输是Java编程中一个重要的...理解并掌握这些知识点,对于实现高效的Java多线程文件传输至关重要。实际应用中,还需要根据具体场景选择合适的同步策略、并发工具以及优化手段,确保程序的稳定性和性能。

    Java实现多线程下载和断点续传

    1. 把每个下载文件切成若干个块...2. HTTP Header里增加Range,如果服务器返回Cotent-Range 说明服务器支持文件定位,可以实现多线程下载 详细看这里 http://blog.csdn.net/maoxiang/archive/2010/04/02/5446293.aspx

    java多线程加队列上传文件_后台处理

    本文将详细介绍一个基于Java实现的多线程文件上传系统,并结合队列管理技术来优化后台处理流程。该系统通过创建多个线程来并行处理客户端的文件上传请求,同时利用队列结构来协调任务的调度与执行。 #### 关键技术...

    Java实现多线程下载源代码

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

Global site tag (gtag.js) - Google Analytics