public class Download { // 服务器的下载地址 // public static String FILEPATH = "http://192.168.86.1:8080/1-9.zip"; public static String FILEPATH = "http://dldir1.qq.com/invc/tt/QQBrowserSetup.exe"; // 本地保存的路径 public static String DESTINATION = "D:\\"; // 下载的线程数 public static int THREADCOUNT = 5; public static void main(String[] args) throws Exception { URL url = new URL(FILEPATH); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 连接超时 conn.setConnectTimeout(5 * 1000); // 下载通过GET请求 conn.setRequestMethod("GET"); // 设置代理 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"); conn.setRequestProperty("Connection", "keep-alive"); if (conn.getResponseCode() == 200) { // 文件的大小 int contentLength = conn.getContentLength(); // 将文件分成5份 int blocksize = contentLength / THREADCOUNT; // 此类的实例支持对随机访问文件的读取和写入 // 并建立一个空的文件 RandomAccessFile randomAccessFile = new RandomAccessFile(new File(Download.DESTINATION + Download.getFileName(Download.FILEPATH)), "rwd"); randomAccessFile.setLength(contentLength); randomAccessFile.close(); conn.disconnect(); for (int i = 0; i < THREADCOUNT; i++) { // 少下载一个字节 int startpos = i * blocksize; int endpos = (i + 1) * blocksize - 1; if (i == THREADCOUNT - 1) { endpos = contentLength; } new Thread(new DownloadTask(i, startpos, endpos)).start(); } } else { System.out.println("服务器出错!"); } } // 截取文件名 public static String getFileName(String path) { return path.substring(path.lastIndexOf("/") + 1, path.length()); } } // 多线程的任务 class DownloadTask implements Runnable { public DownloadTask(int id, int startpos, int endpos) { this.id = id; this.startpos = startpos; this.endpos = endpos; } int id; int startpos; int endpos; @Override public void run() { try { URL url = new URL(Download.FILEPATH); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(5 * 1000); conn.setRequestMethod("GET"); // Request only part of an entity. Bytes are numbered from 0. // eg:Range: bytes=500-999 conn.setRequestProperty("Range", "bytes=" + startpos + "-" + endpos + ""); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"); conn.setRequestProperty("Connection", "keep-alive"); // HTTP Status-Code 206: Partial Content. if (conn.getResponseCode() == 206) { InputStream is = conn.getInputStream(); RandomAccessFile randomAccessFile = new RandomAccessFile(new File(Download.DESTINATION + Download.getFileName(Download.FILEPATH)), "rwd"); // 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。 randomAccessFile.seek(startpos); int len = 0; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { randomAccessFile.write(buffer, 0, len); } is.close(); randomAccessFile.close(); conn.disconnect(); System.out.println("线程" + id + ":下载完毕"); } } catch (IOException e) { e.printStackTrace(); } } }
相关推荐
下面我们将深入探讨如何使用Java实现多线程下载。 1. **线程基础知识**: - 线程是操作系统调度的基本单位,一个进程中可以有多个线程并发执行。 - Java提供了内置的线程支持,包括`Thread`类和`Runnable`接口,...
本项目"Java实现多线程下载源代码"正是这样一个示例,它使用了NetBeans IDE创建用户界面,使得用户能够更加直观地管理和监控下载过程。 首先,我们来深入理解Java中的多线程。在Java中,线程是程序执行的最小单位,...
java实现多线程下载,控制台实时输出下载进度,对于学习多线程与网络有一定的帮助
在Java编程中,多线程下载文件是一种优化大文件下载速度和效率的技术。它通过将一个大文件分割成多个小部分,然后同时启动多个线程分别下载这些部分,从而达到加速下载的效果。以下是对这个主题的详细解释: 1. **...
1. 把每个下载文件切成若干个块...2. HTTP Header里增加Range,如果服务器返回Cotent-Range 说明服务器支持文件定位,可以实现多线程下载 详细看这里 http://blog.csdn.net/maoxiang/archive/2010/04/02/5446293.aspx
在Java编程领域,多线程下载是一个常见的技术实践...这个Java实现的多线程下载程序是学习并发编程和网络I/O的一个良好实例,通过对源代码的研究,开发者可以了解如何在实际项目中有效地使用Java的并发特性来提高性能。
用NetBeans编的一个Java多线程下载程序,这只是一个JAR包,大家可以感受下哈!
4. **Java实现多线程下载的关键类与方法**: - `Thread` 类或 `Runnable` 接口:用于创建和管理线程。 - `ExecutorService` 和 `ThreadPoolExecutor`:提供线程池服务,管理线程的创建和销毁,避免频繁创建销毁...
在标题"duoxianchengxiazai.rar_Java 多线程 下载_java 多线程下载"中,我们可以看出这是一个关于Java实现多线程下载的示例代码或教程。 描述提到"多线程下载,随便做的,有一定的局限性,仅供参考",这意味着提供...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
本篇文章将深入探讨如何使用Java实现多线程文件传输,并涵盖以下几个关键知识点: 1. **线程基础**:在Java中,线程是程序执行的基本单元,可以通过实现`Runnable`接口或继承`Thread`类来创建。`Runnable`接口更...
**Java实现多线程下载的关键点:** 1. **文件分块**:使用`RandomAccessFile`类来处理文件的读写,可以精确地定位到文件的某一部分进行写入。 2. **线程管理**:使用`Thread`或`ExecutorService`来创建和管理下载...
Java实现的多线程下载工具是一种利用Java编程语言来提高文件下载效率的技术。在传统的单线程下载方式中,文件的下载过程由一个线程执行,可能会受到网络波动、服务器响应速度等因素的影响,导致下载速度慢且不稳定。...
在Java中实现多线程下载器涉及许多关键概念和技术,包括线程、并发控制、网络I/O以及进度监控。 1. **线程**:在Java中,线程是程序执行的最小单位,每个线程负责一部分文件的下载任务。Java提供两种方式创建线程:...
刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...