A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王永荣 中级黑马   /  2012-11-16 17:09  /  1070 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天刚学到RandomAccessFile类,听毕老师讲这个类可以实现下载软件的多线程下载,于是动手写了下面这段代码。
求指点~~{:soso_e106:}
  1. /**
  2. 需求:用RandomAccessFile模拟多线程下载数据。
  3. 分析:1,将要下载文件和保存路径用File封装为对象file1和file2。
  4.           2,线程中用RandomAccessFile seek方法确定开始的位置,读取file1中的数据,对应的file2写入数据。
  5. */
  6. import java.io.*;
  7. class RandomAccessFileTest{
  8.         public static void main(String[] args){
  9.                 File file1 = new File("testfiles\\2.mp3");
  10.                 File file2 = new File("testfiles\\1.mp3");
  11.                 if(!file1.exists()){
  12.                         throw new RuntimeException("文件不存在!");
  13.                 }
  14.                 long part =  file1.length()/1024/1024; //将文件按1MB分段。
  15.                 DownLoading[] downLoadThread =new DownLoading[(int)part+1]; //创建一个线程数组,有几段就分配几个线程。
  16.                 for(int x=0 ; x<=(int)part ; x++){
  17.                         downLoadThread[x] = new DownLoading();
  18.                         downLoadThread[x].setFile(file1,file2,x);
  19.                         
  20.                 }
  21.                 for(DownLoading dlt:downLoadThread){
  22.                         dlt.start();
  23.                 }

  24.         }

  25. }
  26. class DownLoading extends Thread{        
  27.         /**
  28.         @param file1 下载文件
  29.         @param file2 保存路径
  30.         @param pos 线程读写指针
  31.         @author @yrom
  32.         @version 1.0
  33.         @date 2012-11-16
  34.         */
  35.         private File file1;
  36.         private File file2;
  37.         private long pos;

  38.         //设置文件下载和保存路径已经每个线程读写的位置。
  39.         public void setFile(File file1, File file2,int pos){
  40.                 this.file1 = file1;
  41.                 this.file2 = file2;
  42.                 this.pos = (long)pos;
  43.         }
  44.         public void run(){
  45.                 pos = 1024*1024*pos; //定义起始的字节数。
  46.                 downloading(pos,file1,file2);
  47.                 System.out.println(Thread.currentThread().getName()+"run.");
  48.         }
  49.         //下载方法
  50.         private void downloading(long pos,File file1,File file2){
  51.                 byte[] buf = new byte[1024*1024];  //以1MB为分段长度
  52.                 try{
  53.                 RandomAccessFile raf1 = new RandomAccessFile(file1,"rw");
  54.                 RandomAccessFile raf2 = new RandomAccessFile(file2,"rw");
  55.                 //设置分段开始位置。
  56.                 raf1.seek(pos);
  57.                 raf2.seek(pos);
  58.                 //每个线程只读写1MB的数据。
  59.                 int len = raf1.read(buf);
  60.                 raf2.write(buf,0,len);
  61.                 raf1.close();
  62.                 raf2.close();
  63.                 }
  64.                 catch(IOException e){
  65.                         throw new RuntimeException("Something is wrong!");
  66.                 }
  67.         }
  68. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马