今天刚学到RandomAccessFile类,听毕老师讲这个类可以实现下载软件的多线程下载,于是动手写了下面这段代码。
求指点~~{:soso_e106:}- /**
- 需求:用RandomAccessFile模拟多线程下载数据。
- 分析:1,将要下载文件和保存路径用File封装为对象file1和file2。
- 2,线程中用RandomAccessFile seek方法确定开始的位置,读取file1中的数据,对应的file2写入数据。
- */
- import java.io.*;
- class RandomAccessFileTest{
- public static void main(String[] args){
- File file1 = new File("testfiles\\2.mp3");
- File file2 = new File("testfiles\\1.mp3");
- if(!file1.exists()){
- throw new RuntimeException("文件不存在!");
- }
- long part = file1.length()/1024/1024; //将文件按1MB分段。
- DownLoading[] downLoadThread =new DownLoading[(int)part+1]; //创建一个线程数组,有几段就分配几个线程。
- for(int x=0 ; x<=(int)part ; x++){
- downLoadThread[x] = new DownLoading();
- downLoadThread[x].setFile(file1,file2,x);
-
- }
- for(DownLoading dlt:downLoadThread){
- dlt.start();
- }
- }
- }
- class DownLoading extends Thread{
- /**
- @param file1 下载文件
- @param file2 保存路径
- @param pos 线程读写指针
- @author @yrom
- @version 1.0
- @date 2012-11-16
- */
- private File file1;
- private File file2;
- private long pos;
- //设置文件下载和保存路径已经每个线程读写的位置。
- public void setFile(File file1, File file2,int pos){
- this.file1 = file1;
- this.file2 = file2;
- this.pos = (long)pos;
- }
- public void run(){
- pos = 1024*1024*pos; //定义起始的字节数。
- downloading(pos,file1,file2);
- System.out.println(Thread.currentThread().getName()+"run.");
- }
- //下载方法
- private void downloading(long pos,File file1,File file2){
- byte[] buf = new byte[1024*1024]; //以1MB为分段长度
- try{
- RandomAccessFile raf1 = new RandomAccessFile(file1,"rw");
- RandomAccessFile raf2 = new RandomAccessFile(file2,"rw");
- //设置分段开始位置。
- raf1.seek(pos);
- raf2.seek(pos);
- //每个线程只读写1MB的数据。
- int len = raf1.read(buf);
- raf2.write(buf,0,len);
- raf1.close();
- raf2.close();
- }
- catch(IOException e){
- throw new RuntimeException("Something is wrong!");
- }
- }
- }
复制代码 |