java 多线程下载

 1   import java.io.ByteArrayOutputStream;
 2 import java.io.InputStream;
 3
 4 public class StreamTool {
 5     /**
 6      * 把一个inputstream里面的内容转化成一个byte[]
 7      */
 8     public static byte[] getBytes(InputStream is) throws Exception {
 9         ByteArrayOutputStream bos = new ByteArrayOutputStream();
10         byte[] buffer = new byte[1024];
11         int len = 0;
12         while ((len = is.read(buffer)) != -1) {
13             bos.write(buffer, 0, len);
14         }
15         is.close();
16         bos.flush();
17         byte[] result = bos.toByteArray();
18         System.out.println(new String(result));
19         return result;
20     }
21 }
  1 import java.io.File;
  2 import java.io.FileInputStream;
  3 import java.io.FileOutputStream;
  4 import java.io.InputStream;
  5 import java.io.RandomAccessFile;
  6 import java.net.HttpURLConnection;
  7 import java.net.URL;
  8
  9 public class TestDownload {
 10     public static final String path = "http://192.168.1.100:8080/aaa.exe";
 11
 12     public static void main(String[] args) throws Exception {
 13         URL url = new URL(path);
 14         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 15         conn.setRequestMethod("GET");
 16         conn.setConnectTimeout(5000);
 17         conn.setRequestProperty("User-Agent",
 18            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
 19         int code = conn.getResponseCode();
 20         if (code == 200) {
 21             int len = conn.getContentLength();
 22             RandomAccessFile file = new RandomAccessFile(
 23                "C:/Users/DELL/Desktop/" + getFilenName(path), "rwd");
 24             // 1.设置本地文件大小跟服务器的文件大小一致
 25             file.setLength(len);
 26
 27             // 2 .假设开启3 个线程
 28             int threadnumber = 3;
 29             int blocksize = len / threadnumber;
 30             /**
 31              * 线程1 0~ blocksize 线程2 1*bolocksize ~ 2*blocksize 线程3 2                   *blocksize ~
 32              * 文件末尾
 33              */
 34             for (int i = 0; i < threadnumber; i++) {
 35                 int startposition = i * blocksize;
 36                 int endpositon = (i + 1) * blocksize;
 37                 if (i == (threadnumber - 1)) {
 38                     // 最后一个线程
 39                     endpositon = len;
 40                 }
 41                 DownLoadTask task = new DownLoadTask(                       i, path, startposition,endpositon);
 43                 task.start();
 44             }
 45         }
 46     }
 47
 48     public static String getFilenName(String path) {
 49         int start = path.lastIndexOf("/") + 1;
 50         return path.substring(start, path.length());
 51     }
 52
 53 }
 54
 55 class DownLoadTask extends Thread {
 56     public static final String path = "http://192.168.1.100:8080/aaa.exe";
 57     int threadid;
 58     String filepath;
 59     int startposition;
 60     int endpositon;
 61
 62     public DownLoadTask(int threadid, String filepath,                 int startposition, int endpositon) {
 64         this.threadid = threadid;
 65         this.filepath = filepath;
 66         this.startposition = startposition;
 67         this.endpositon = endpositon;
 69     }
 70
 71     @Override
 72     public void run() {
 73         try {
 74             File postionfile = new File(threadid + ".txt");
 75             URL url = new URL(filepath);
 76             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 77             System.out.println("线程" + threadid + "正在下载 " + "开始位置 : "
 78                     + startposition + "结束位置 " + endpositon);
 79
 80             // 断点操作
 81             if (postionfile.exists()) {
 82                 FileInputStream fis = new FileInputStream(postionfile);
 83                 byte[] result = StreamTool.getBytes(fis);
 84                 int newstartposition = Integer.parseInt(new String(result));
 85                 if (newstartposition > startposition) { // 如果新的位置 > 开始位置。
 86                     startposition = newstartposition;
 87                 }
 88             }
 89
 90             // "Range", "bytes=2097152-4194303")
 91             conn.setRequestProperty("Range", "bytes=" + startposition + "-"
 92                     + endpositon);
 93             conn.setRequestMethod("GET");
 94             conn.setConnectTimeout(5000);
 95             conn.setRequestProperty("User-Agent",
 96                     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
 97             InputStream is = conn.getInputStream();
 98             RandomAccessFile file = new RandomAccessFile(
 99                     "C:/Users/DELL/Desktop/" + getFilenName(path), "rwd");
100             // 设置 数据从文件哪个位置开始写
101             file.seek(startposition);
102             byte[] buffer = new byte[1024];
103             int len = 0;
104
105             // 代表当前读到的服务器数据的位置 ,同时这个值已经存储的文件的位置
106             int currentPostion = startposition;
107
108             // 创建一个文件对象 ,记录当前某个文件的下载位置
109             while ((len = is.read(buffer)) != -1) {
110                 file.write(buffer, 0, len);
111
112                 currentPostion += len;
113                 // 需要把currentPostion 信息给持久化到存储设备
114                 String position = currentPostion + "";
115                 System.out.println("线程 .." + threadid + "....开始位置..."
116                         + startposition + "..当前位置..." + currentPostion
117                         + "...结束位置...." + endpositon);
118                 FileOutputStream fos = new FileOutputStream(postionfile);
119                 fos.write(position.getBytes());
120                 fos.flush();
121                 fos.close();
122             }
123             file.close();
124             System.out.println("线程" + threadid + "下载完毕");
125             // 当线程下载完毕后 把文件删除掉
126             if (postionfile.exists()) {
127                 postionfile.delete();
128             }
129         } catch (Exception e) {
130             e.printStackTrace();
131         }
132         super.run();
133     }
134
135     public static String getFilenName(String path) {
136         int start = path.lastIndexOf("/") + 1;
137         return path.substring(start, path.length());
138     }
139
140 }
1 public class test1 {
2     public static void main(String[] args) throws Exception {
3         RandomAccessFile file = new RandomAccessFile("haha.txt", "rwd");
4         file.setLength(1024 * 1024);
5     }
6 }
时间: 2024-07-29 03:23:44

java 多线程下载的相关文章

最新---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,连接到服务

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

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 多线程下载及断点续传

断点续传和多线程下载原理是一样的; 关键代码关键位置:即设置断点 http2.setRequestProperty("RANGE","bytes="+startl+"-");//设置断点位置,向服务器请求从文件的哪个字节开始读取.osf.seek(startl);//设置本地文件从哪个字节开始写入. 如果是单线程,则首先要判断下载文件是否已经存在;如果存在则开始断点续传,方法同多线程:因为断点续传是从上次传输中断的字节开始,则首先要得到上次中断的

Java多线程下载器FileDownloader(支持断点续传、代理等功能)

前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownloader 目前实现的主要功能有: 多线程下载 断点续传 自定义头部等 即将完成的包括: 添加代理功能 ... 感觉做了回标题党,代理功能由于时间关系,将在下次更新加入. 关于设置代理,我这篇文章 Java实现Ip代理池 中有具体的设置方法. 另外除了这个代理功能,我也实在不知道下载器能加些啥功能了..

Java 多线程下载示例

项目结构: FileDownload.java: package com.wl.download; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.text.DecimalFormat; import org.apache.http.HttpResponse; import org.

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;

JavaSE多线程下载的实现

本文中主要提供的是java多线程下载文件方案,以及java多线程将临时进度保存到文件,多线程断点续传的实现: 1.多线程下载 2.将下载进度保存到临时文件,多线程的断定续传 1.多线程下载 本例中首先在Tomcat服务器中的WEBAPP/ROOT/文件夹下面放置了SoftwareOffer.exe的二进制可执行文件,如果放置图片的话,中间数据如果出错,不容易用肉眼识别,但是如果是二进制文件的话,如果中间任何二进制的一位数据出错,必然造成二进制可执行文件无法运行!所以测试选择二进制可执行文件比较妥