Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 269|回复: 0

[Java线程学习]用RandomAccessFile实现多线程下载(JAVA)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-30 23:58:29 | 显示全部楼层 |阅读模式
    多线程下载的例子,如果问题,希望讨论下.
    1. import java.io.*;
    2. import java.net.*;
    3. public class MyMutilDown {   
    4. /**  
    5.      * 单线程的远程下载  
    6.      */  
    7.     public void testOneTDown(String filePath, String url) {   
    8.         try {   
    9.             // 要写入的文件   
    10.             File file = new File(filePath + getFileExtName(url));   
    11.             FileWriter fWriter = new FileWriter(file);   
    12.             URL ul = new URL(url);   
    13.             URLConnection conn = ul.openConnection();   
    14.             conn.setConnectTimeout(2000);// 请求超时时间   
    15.             // int len = conn.getContentLength();   
    16.             InputStream in = conn.getInputStream();   
    17.             // byte[] by = new byte[1024];   
    18.             int temp = 0;   
    19.             while ((temp = in.read()) != -1) {   
    20.                 fWriter.write(temp);   
    21.             }   
    22.             fWriter.close();   
    23.             in.close();   
    24.         } catch (MalformedURLException e) {   
    25.             // TODO Auto-generated catch block   
    26.             e.printStackTrace();   
    27.         } catch (IOException e) {   
    28.             // TODO Auto-generated catch block   
    29.             e.printStackTrace();   
    30.         }   
    31.   
    32.     }   
    33.   
    34.     /**  
    35.      * 文件后缀名  
    36.      *   
    37.      * @param path  
    38.      * @return  
    39.      */  
    40.     public String getFileExtName(String path) {   
    41.         return path.substring(path.lastIndexOf("."));   
    42.     }   
    43. /**  
    44.      * 测试多线程  
    45.      *   
    46.      * @param filePath  
    47.      *            文件保存路径  
    48.      * @param url  
    49.      *            url  
    50.      * @param tnum  
    51.      *            线程数量  
    52.      */  
    53.     public void testMoreTDown(String filePath, String url, int tnum) {   
    54.         try {   
    55.             // 要写入的文件   
    56.             final File file = new File(filePath + getFileExtName(url));   
    57.             RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");// 建立随机访问   
    58.             final URL ul = new URL(url);   
    59.             HttpURLConnection conn = (HttpURLConnection) ul.openConnection();   
    60.             conn.setConnectTimeout(2000);// 请求超时时间   
    61.             conn.setRequestMethod("GET");   
    62.             int len = conn.getContentLength();// 文件长度   
    63.             accessFile.setLength(len);   
    64.             accessFile.close();   
    65.             final int block = (len + tnum - 1) / tnum;// 每个线程下载的快大小   
    66.                
    67.             for (int i = 0; i < tnum; i++) {   
    68.                 final int a = i;   
    69.                 new Thread(new Runnable() {   
    70.                     int start = block * a;// 开始位置   
    71.                     int end = block * (a + 1) - 1;// 结束位置   
    72.                     @Override  
    73.                     public void run() {   
    74.                         HttpURLConnection conn2 = null;   
    75.                         RandomAccessFile accessFile2 = null;   
    76.                         InputStream in = null;   
    77.                         try {   
    78.                             conn2 = (HttpURLConnection) ul.openConnection();   
    79.                             conn2.setConnectTimeout(2000);// 请求超时时间   
    80.                             conn2.setRequestMethod("GET");   
    81.                             // TODO Auto-generated method stub   
    82.                             conn2.setRequestProperty("Range", "bytes=" + start   
    83.                                     + "-" + end + "");// 设置一般请求属性 范围   
    84.                             in = conn2.getInputStream();   
    85.                             byte[] data = new byte[1024];   
    86.                             int len = 0;   
    87.                             accessFile2 = new RandomAccessFile(file, "rwd");   
    88.                             accessFile2.seek(start);   
    89.                               
    90.                             while ((len = in.read(data)) != -1) {   
    91.                                 accessFile2.write(data, 0, len);   
    92.                             }   
    93.                             System.out.println("线程:" + a + "下载完成!");   
    94.                         } catch (IOException e1) {   
    95.                             // TODO Auto-generated catch block   
    96.                             e1.printStackTrace();   
    97.                         } finally {   
    98.                             try {   
    99.                                 accessFile2.close();   
    100.                                 in.close();   
    101.                             } catch (IOException e) {   
    102.                                 // TODO Auto-generated catch block   
    103.                                 e.printStackTrace();   
    104.                             }   
    105.   
    106.                         }   
    107.                     }   
    108.                 }).start();   
    109.                  
    110.             }   
    111.                
    112.   
    113.         } catch (MalformedURLException e) {   
    114.             // TODO Auto-generated catch block   
    115.             e.printStackTrace();   
    116.         } catch (IOException e) {   
    117.             // TODO Auto-generated catch block   
    118.             e.printStackTrace();   
    119.         }   
    120.     }   
    121.   
    122.     /**  
    123.      * @param args  
    124.      * @throws IOException  
    125.      */  
    126.     public static void main(String[] args) throws IOException {   
    127.         // TODO Auto-generated method stub   
    128.         MyMutilDown mydown = new MyMutilDown();   
    129.         String path = "http://www.java3z.com/cwbwebhome/dir1/dir5/mon664.zip";   
    130.         // mydown.downLoad(path, "D:\aa", 1);   
    131.         // mydown.testOneTDown("D:", path);   
    132.         mydown.testMoreTDown("c:\ex\ok", path, 3);   
    133.     }   
    134. }  
    复制代码
    运行:
    C:ex>java MyMutilDown
    线程:0下载完成!
    线程:2下载完成!
    线程:1下载完成!

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/30/235829281.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-6 01:48 , Processed in 0.420867 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表