黑马程序员技术交流社区
标题:
用RandomAccessFile模拟多线程下载数据。
[打印本页]
作者:
王永荣
时间:
2012-11-16 17:09
标题:
用RandomAccessFile模拟多线程下载数据。
今天刚学到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!");
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2