Java多线程下载文件实现案例详解

网友投稿 300 2022-12-06


Java多线程下载文件实现案例详解

原理解析:

利用RandomAccessFile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同。 根据线程的数量(假设有三个线程),服务器的文件三等分,并把我们在本地创建的文件同样三等分,每个线程下载自己负责的部分,到相应的位置即可。

示例图:

代码如下

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 chttp://ontentLength = 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) {

}

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java三种IO模型原理实例详解
下一篇:Java实现数字连连消
相关文章

 发表评论

暂时没有评论,来抢沙发吧~