多线程下载(1)

一个文件实现多线程下载

  • 例如下载一个视频的时候,文件很大却又想下载快些就可以使用多线程进行下载。多线程的方式把一个视频查分成多个视频进行下载,加快啦视频的下载速度

多个文件实现多线程

  • 实现多个文件同时下载,通过爬虫的方式,或者其他渠道获得到的图片、视频路径(多个),如果成千上百个图片、视频还好你可以等一会,但是上万个,就算一个文件一秒,你也不相等把,如果是视频呢,所以就总结了一下,使用多线程的方式,同时下载多个文件。既加快啦速度页,节省啦时间。

下面实现一个文件的多线程下载 (完整版复制就可以使用)

  1. 创建一个StartThread 类继承 Runnable 实现多线程
package com.youzan.thread.onefilethread; // 类名的路径地址  改成你对应的类名地址
	import java.io.File;
	import java.io.InputStream;
	import java.io.RandomAccessFile;
	import java.net.HttpURLConnection;
	import java.net.URL;
		
	public class StartThread implements Runnable{
		private String urlLocation;
	
	    private String filePath;
	
	    private long start;
	
	    private long end;
	    
		public StartThread(String urlLocation, String filePath, long start, long end) {
			this.urlLocation = urlLocation;
	        this.filePath = filePath;
	        this.start = start;
	        this.end = end;
		}

		@Override
		public void run() {
			try {

				System.out.println("进入多线程方法");
				
				HttpURLConnection conn=getHttp();
				
				conn.setRequestProperty("Range", "bytes=" + start + "-" + end);
				System.out.println("图片名称-->"+filePath);
				
				File file = new File(filePath);
	            RandomAccessFile out = null;
				
	            if(file !=null){
	            	out = new RandomAccessFile(file,"rwd");
	            }
	            
	            out.seek(start);
	            InputStream in = conn.getInputStream();
	            
	            byte[] b = new byte[1024];
	            int len = 0;
	            while ((len = in.read(b)) != -1){
	                out.write(b, 0, len);
	            }
	            in.close();
	            out.close();
	        
	            
			} catch (Exception e) {
				System.out.println("download fail");
				e.printStackTrace();
				
			}
			
		}

		/**
			 * 创建连接
			 * @return
			 */
			 public HttpURLConnection getHttp(){
		         URL url = null;
		         HttpURLConnection conn =null;
		         try {
					
			         if (urlLocation != null){
			             url = new URL(urlLocation);
			         }
			         conn= (HttpURLConnection) url.openConnection();
			         conn.setReadTimeout(5000);
			         conn.setRequestMethod("GET");
		         } catch (Exception e) {
		 			System.out.println("getHttp error");
		 		}
		         return conn;
		     }
	}
  1. 创建CreateThread类实现创建线程以及对文件的分解
package com.youzan.thread.onefilethread; // 类名的路径地址  改成你对应的类名地址
	
	import java.io.IOException;
	import java.net.HttpURLConnection;
	import java.net.URL;
	import java.util.concurrent.ExecutorService;
	import java.util.concurrent.Executors;


	public class CreateThread {
		/**
		 * 实现多线程 方法
		 * @param urlLocation //网络图片地址    多个图片用逗号(,)隔开 使用 同时下载多个文件///  一个图片使用 
		 * @param filePath
		 * @param poolLength
		 * @throws IOException
		 */
		public void getFileWithThreadPool(String urlLocation,String filePath, int poolLength) throws IOException{
	        
			ExecutorService threadPool = Executors.newFixedThreadPool(poolLength);
			/**
			 * 下载一个文件多线程下载(一个文件很大 可以由多个线程一起下载)
			 */
			long len = getContentLength(urlLocation);
	        System.out.println("一个文件大小--》"+len+"--线程数--》"+poolLength);
	        
	        for(int i=0;i<poolLength;i++){
	        	
	            long start=i*len/poolLength;
	            long end = (i+1)*len/poolLength-1;
	            
	            System.out.println("start-->"+start+"--end-->"+end);
	            if(i==poolLength-1){
	                end =len;
	                System.out.println("len 赋值");
	            }
	            
	            //创建多个线程
	            StartThread download=new StartThread(urlLocation, filePath+"140G61501440-L.jpg", start,end);
	            threadPool.execute(download);
	            
	        }
	        
			//让线程执行完自动关闭
	        threadPool.shutdown();
	        System.err.println("分配线程 任务结束");
	    }
		
		
		/**
		 * 获取文件的大小 (单位 byte)
		 * @param urlLocation
		 * @return
		 * @throws IOException
		 */
		private static long getContentLength(String urlLocation) throws IOException{
	        URL url = null;
	        if (urlLocation != null)
	        {
	            url = new URL(urlLocation);
	        }
	        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	        conn.setReadTimeout(5000);
	        conn.setRequestMethod("GET");
	        long len = conn.getContentLength();
	
	        return len;
	    }
	}
  1. 实现类main
public class text {
	public static void main(String[] args) {
	try {
				
				//一个文件  多线程下载
				String url="http://img.tupianzj.com/uploads/allimg/140716/3-140G61501440-L.jpg";
				
				CreateThread createThread=new CreateThread();
				// 网络文件url --- 存放路径 --- 创建的线程数
				createThread.getFileWithThreadPool(url,"D:/临时/threadimg/",3);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

【一个文件分成多个线程下载就完成啦】

有什么疑惑,或者问题,在下面留言。