最新---java多线程下载文件

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class Demo {
	// 定义线程个数
	public static int threadCount = 5;

	public static void main(String[] args) throws Exception {
		// 1,连接到服务器,获取一个文件,获取文件的大小跟服务器的文件一样的临时文件
		String path = "http://172.22.64.193:8080/0001AndroidWebService/test.exe";
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		// 设置超时
		conn.setConnectTimeout(5000);
		// 设置请求方式
		conn.setRequestMethod("GET");
		// 获取服务器的返回码
		int code = conn.getResponseCode();
		// 判断返回码
		if (code == 200) {
			// 获取返回的长度
			int length = conn.getContentLength();
			System.out.println("文件总长度:" + length);

			// 在客户端创建出一个跟服务器大小一致的临时文件
			RandomAccessFile raf = new RandomAccessFile("temp.exe", "rwd");
			// 指定临时文件的大小
			raf.setLength(length);
			// 释放资源
			raf.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 DownlodeThread(path, threadId, startIndex, endIndex)
						.start();
			}
		}
	}

	/**
	 * 下载文件的子线程类,每一个线程下载对应位置文件数据
	 *
	 * @author MartinDong
	 *
	 */
	public static class DownlodeThread extends Thread {
		private String path;
		private int threadId;
		private int startIndex;
		private int endIndex;

		/**
		 *
		 * @param path
		 *            文件的下载路径
		 * @param threadId
		 *            线程id
		 * @param startIndex
		 *            线程开始的位置
		 * @param endIndex
		 *            线程结束的位置
		 */
		public DownlodeThread(String path, int threadId, int startIndex,
				int endIndex) {
			this.path = path;
			this.threadId = threadId;
			this.startIndex = startIndex;
			this.endIndex = endIndex;
		}

		@Override
		public void run() {
			try {
				// 将地址转换为URL
				URL url = new URL(path);
				// 获取http连接
				HttpURLConnection conn = (HttpURLConnection) url
						.openConnection();
				// 设置连接的请求方式
				conn.setRequestMethod("GET");
				// 重要:请求服务器下载部分的文件,指定文件的位置
				conn.setRequestProperty("Range", "bytes=" + startIndex + "-"
						+ endIndex);
				// 设置超时时间
				conn.setReadTimeout(5000);
				// 得到服务器的状态码,200表示请求的全部资源得到响应=== ok,206请求的部分资源得到响应=== ok
				int code = conn.getResponseCode();
				System.out.println("code:" + code);
				// 返回的是指定位置的文件流
				InputStream is = conn.getInputStream();
				// 创建一个临时的文件
				RandomAccessFile raf = new RandomAccessFile("temp.exe", "rwd");
				// 移动指针,到指定的文件位置,
				raf.seek(startIndex);

				// 创建中间缓冲字节数组
				byte[] buffer = new byte[1024];
				int length = 0;
				while ((length = is.read(buffer)) != -1) {
					raf.write(buffer, 0, length);
				}
				is.close();
				raf.close();
				System.out.println("线程:" + threadId + "下载完毕............");

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}

最新---java多线程下载文件,布布扣,bubuko.com

时间: 2024-09-29 10:10:00

最新---java多线程下载文件的相关文章

Java多线程下载文件

package com.test.download; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; /*  * 多线程下载  */ public class MulThreadDownload {     public static void main(String[]

java多线程下载文件和断点下载

多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile;

多线程下载文件,以及断点下载

一:前言 多线程下载文件,可能有的同学没有过多的听说过,但是断点下载肯定是听过的,也就是说像讯雷,哪怕你把电脑重启了,讯雷重新启动后也会接着原来的地方下载,那么这是怎么做到的呢? 二:代码示例 直接给出代码, 2.1.经典代码 两行经典的代码分别为: //设置下载的开始及结束位置 conn.setRequestProperty("Range", "bytes="+start+"-"+end+""); //设置读写的起点位置 R

多线程下载文件(支持暂停、取消、断点续传)

多线程下载文件(支持暂停.取消.断点续传) 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来即可. 涉及的知识及问题 请求的数据如何分段 分段完成后如何下载和下载完成后如何组装到一起 暂停下载和继续下载的实现(wait().notifyAll().synchronized的使用) 取消下载和断点续传的实现 一.请求的数据如何分段 首先通过HttpURLConne

多线程实现多线程下载文件

下载文件的时候,一个大文件切成很多片,用多线程下载,速度会快很多 阅读代码的时候注意查看代码里面的注释想用多线程下载文件,则, 第一:得了解  RandomAccessFile  类,这是个随机访问文件类,里面可以设置 访问的 开始地址和结束地址,且该类可读可写. RandomAccessFile out = new RandomAccessFile(file, "rw"); 则表示,该类可读可写.通过 out.seek(start)  可以定位开始读取的位置. 第二:既然是网络文件下

JAVA多线程读写文件范例

在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位作者写的基础上做了改良,但已不记得原文的地址.如果有知情者,烦请帖出地址,我在此文上加入引用或转载. 本程序是基于这么一种考虑,某系统后台有个将近2G大小的日志文件,你用任何编辑器去打开它,都将会很困难.针对这样的大文件解析处理,解决方案是使用多个线程,分割读取指定的大文件.获取我们所需要的信息.不多说,上代码了,有注释可以帮助理解. Java代码   package com.thre

java多线程下载

多线程下载是通过占有服务器资源来提高速度的.每个线程应该下载一个文件的不同位置,假如现在有一个长度为10的资源,有三个线程,那么第一个线程下载的长度为012,第二个为345,第四个为6789所以问题来了每个线程下载的长度是多少呢?线程的id为0,1,2每个线程下载的数量=总长度/线程数量size=10/3start:id*sizeend:(id+1)*size-1最后一个线程的结束位置为:总长度-1 package down; import java.io.File; import java.i

java 多线程下载功能

import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class Demo { private static int threadCount = 3; /** * 多线程下载测试类 * @param args * @throws Exception */ public static void main(S

安卓 多线程下载文件

HTTP文件多线程下载 测试代码 String downloadUrl = "http://192.168.31.162/FileServer/SoftApk/UC-11.5.5.943.apk"; String filepath = PathUtils.getCachePath() + "UC-11.5.5.943.apk"; /** * 多线程下载 * 基于:http://blog.csdn.net/mad1989/article/details/3842146