这篇文章主要介绍了Java多线程下载文件实现案例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
原理解析:
利用RandomAccessFile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同。 根据线程的数量(假设有三个线程),服务器的文件三等分,并把我们在本地创建的文件同样三等分,每个线程下载自己负责的部分,到相应的位置即可。
示例图:

代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class MutilDownload {
private static String path = "http://192.168.80.85:8080/test.doc" ;
private static final int threadCount = 3 ;
public static void main(String[] args) {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod( "GET" );
conn.setConnectTimeout( 5000 );
int responseCode = conn.getResponseCode();
if (responseCode == 200 ) {
int contentLength = conn.getContentLength();
System.out.println( "length" + contentLength);
RandomAccessFile rafAccessFile = new RandomAccessFile( "test.doc" , "rw" );
rafAccessFile.setLength(contentLength);
int blockSize = contentLength / threadCount;
for ( int i = 0 ; i < threadCount; i++) {
int startIndex = i * blockSize; //每个现成下载的开始位置
int endIndex = (i + 1 ) * blockSize - 1 ; // 每个线程的结束位置
if (i == threadCount - 1 ) {
//最后一个线程
endIndex = contentLength - 1 ;
}
new DownloadThread(startIndex, endIndex, i).start();
}
}
} catch (Exception e) {
}
}
private static class DownloadThread extends Thread {
private int startIndex;
private int endIndex;
private int threadId;
public DownloadThread( int startIndex, int endIndex, int threadId) {
this .startIndex = startIndex;
this .endIndex = endIndex;
this .threadId = threadId;
}
@Override
public void run() {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod( "GET" );
conn.setConnectTimeout( 5000 );
conn.setRequestProperty( "Range" , "bytes=" + startIndex + "-" + endIndex);
//固定写法,请求部分资源
int responseCode = conn.getResponseCode(); // 206表示请求部分资源
if (responseCode == 206 ) {
RandomAccessFile rafAccessFile = new RandomAccessFile( "test.doc" , "rw" );
rafAccessFile.seek(startIndex);
InputStream is = conn.getInputStream();
int len = - 1 ;
byte [] buffer = new byte [ 1024 ];
while ((len = is.read(buffer)) != - 1 ) {
rafAccessFile.write(buffer, 0 , len);
}
rafAccessFile.close();
System.out.println( "线程" + threadId + "下载完成" );
}
} catch (Exception e) {
}
}
}
} |
以上就是本文的全部内容,希望对大家的学习有所帮助 |