文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Java项目中如何利用多线程实现文件下载功能

2023-05-31 16:33

关注

这篇文章将为大家详细讲解有关在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 &#63; 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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯