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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在学毕老师讲的ios时,他给我们留了个作业,就是用RandomAccessFile模拟一个多线程下载的程序。以下是我模拟的代码,也不知道这样模拟对不对?如果不对,正确的代码是什么。
  1. public class ClassTest {

  2.         public static void main(String[] args)throws Exception {
  3.                 //这是源文件
  4.                 File f=new File("e:"+File.separator+"gjqt2_movie02.mp4");
  5.                 //这是复制的路径
  6.                 File k=new File("d:"+File.separator+"copy3.mp4");
  7.                 k.createNewFile();
  8.                 //每个线程用50M来分割
  9.                 long spilt=1024*1024*50;
  10.                 //求出线程数量
  11.                 int threadNum=(int)(f.length()/spilt);
  12.                 System.out.println(threadNum+1);
  13.                 //通过循环建立线程
  14.                 for(int x=0;x<=threadNum;x++)
  15.                 new Thread(new ThreadDownload(x,f,k)).start();
  16.                
  17.                
  18.                
  19.         }

  20. }

  21. class ThreadDownload implements Runnable{
  22.        
  23.         int account;
  24.         int num=1;
  25.         File fread=null;
  26.         File fwrite=null;
  27.        
  28.         RandomAccessFile fr=null;
  29.         RandomAccessFile fw=null;
  30.         ThreadDownload(int account,File fread,File fwrite)
  31.         {
  32.                 this.account=account;
  33.                 this.fread=fread;
  34.                 this.fwrite=fwrite;
  35.         }
  36.        
  37.         public void run(){
  38.                
  39.                 try{
  40.                        
  41.                         RandomAccessFile fr=new RandomAccessFile(fread,"r");
  42.                        
  43.                         RandomAccessFile fw=new RandomAccessFile(fwrite,"rw");
  44.                        
  45.                         fr.seek(1024*1024*50*account);
  46.                         fw.seek(1024*1024*50*account);
  47.                        
  48.                
  49.                         byte[] buf=new byte[1024*1024];
  50.                         int length=0;
  51.                         while(num<=50&&(length=fr.read(buf))!=-1)
  52.                         {
  53.                                 num++;
  54.                                 fw.write(buf,0,length);
  55.                                 buf=new byte[1024*1024];
  56.                         }
  57.                 }
  58.                 catch(Exception e)
  59.                 {
  60.                         throw new RuntimeException("下载失败");
  61.                 }
  62.                 finally
  63.                 {
  64.                         try{
  65.                                 if(fr!=null)
  66.                                         fr.close();
  67.                         }
  68.                         catch(Exception e)
  69.                         {
  70.                                 throw new RuntimeException("读取关闭失败");
  71.                         }

  72.                         try{
  73.                                 if(fw!=null)
  74.                                         fw.close();
  75.                         }
  76.                         catch(Exception e)
  77.                         {
  78.                                 throw new RuntimeException("写入关闭失败");
  79.                         }
  80.                        
  81.                 }
  82.         }
  83. }
复制代码


复制文件和源文件大小一样但占用空间不一样,但是如果用windows自带的复制粘贴的话,文件大小和占用大小都一样,是不是我的代码有问题

0 个回复

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