这篇文章将为大家详细讲解有关在Java项目中如何利用多线程实现文件下载功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
具体内容如下
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[] args) throws Exception { String path = "http://192.168.1.100:8080/Hello/Big.exe"; new MulThreadDownload().download(path, 3); } private void download(String path, int threadSize) throws Exception { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); if (connection.getResponseCode() == 200) { int length = connection.getContentLength();// 获取网络文件长度 File file = new File(getFileName(path)); // 在本地生成一个长度与网络文件相同的文件 RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.setLength(length); accessFile.close(); // 计算每条线程负责下载的数据量 int block = length % threadSize == 0 ? length / threadSize : length / threadSize + 1; for (int threadId = 0; threadId < threadSize; threadId++) { new DownloadThread(threadId, block, url, file).start(); } } else { System.out.println("download fail"); } } private class DownloadThread extends Thread { private int threadId; private int block; private URL url; private File file; public DownloadThread(int threadId, int block, URL url, File file) { this.threadId = threadId; this.block = block; this.url = url; this.file = file; } @Override public void run() { int start = threadId * block; // 计算该线程从网络文件什么位置开始下载 int end = (threadId + 1) * block - 1; // 计算下载到网络文件什么位置结束 try { RandomAccessFile accessFile = new RandomAccessFile(file, "rwd"); accessFile.seek(start); //从start开始 HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); //设置获取资源数据的范围,从start到end connection.setRequestProperty("Range", "bytes=" + start + "-" + end); //注意多线程下载状态码是 206 不是200 if (connection.getResponseCode() == 206) { InputStream inputStream = connection.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { accessFile.write(buffer, 0, len); } accessFile.close(); inputStream.close(); } System.out.println("第" + (threadId + 1) + "条线程已经下载完成"); } catch (Exception e) { e.printStackTrace(); } } } private String getFileName(String path) { return path.substring(path.lastIndexOf("/") + 1); } }
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机在Java项目中如何利用多线程实现文件下载功能
后端开发2023-05-31
如何在Java项目中利用FasfDFS实现一个文件上传下载功能
后端开发2023-05-31
如何在PHP项目中利用Laravel实现一个文件下载功能
后端开发2023-05-31
如何在android项目中使用多线程下载文件
后端开发2023-05-31
如何在JavaWeb项目中实现文件压缩下载功能
后端开发2023-05-31
Spring Boot 项目中如何使用 Python 实现文件下载功能?
后端开发2023-09-04
如何在JAVA项目中利用FTPClient工具类实现一个上传下载功能
后端开发2023-05-31
Java项目中的多线程通信如何利用Socket实现
后端开发2023-05-31
Node中怎么利用WebSocket实现多文件下载功能
后端开发2024-04-02
在java项目中如何实现同步多线程
后端开发2023-05-31
多线程并发编程如何在Java项目中实现
后端开发2023-05-31
如何在Android应用中利用ADT实现一个离线下载功能
后端开发2023-05-31
在Java项目中使用WebUploader如何实现一个文件上传功能
后端开发2023-05-31
在java项目中使用Demo如何实现一个文件上传功能
后端开发2023-05-31
怎么在Android中利用多线程实现一个断点续传下载功能
后端开发2023-05-31
如何在java项目中利用ocr实现一个图片文字识别功能
后端开发2023-05-31
在Java项目中使用fileupload组件如何实现一个文件上传功能
后端开发2023-05-31
咦!没有更多了?去看看其它编程学习网 内容吧