迅雷在下载东西的时候把一个文件分割成好几部分,用几个线程一起下载,以此来提高下载的速度。
Java也可以实现这个功能 。
用一般的文件、缓冲流等来读取时,有一个skip的方法可让文件读取的时候从几个不同的起点开始开始读,但这个方法大家都知道不可靠,不稳定,容易出现一些奇怪的位置错误。
不过Java提供了另一个类:RandomAccessFile,它可以跳到文件的任意地方开始读。
有几个朋友问过我文件多线程下载的问题,今天就写一个程序实现一下。。。
package cn.ling.test1;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class TestRAF {
private final static int parts = 5; //把文件分成5份
/**
* @param args
*/
public static void main(String[] args) {
for(int i = 0; i < parts; i ++){
ReadFile rf = new ReadFile(i,parts,"F:/Win7/eclipse361/ws/TestMark/src/cn/ling/test1/test.jpg");
rf.start();
}
System.out.println("复制成功!");
}
}
class ReadFile extends Thread{
private int start = 0;
private int parts = 0;
private String file = "";
public ReadFile(int start,int parts, String file){
this.start = start;
this.file = file;
this.parts = parts;
}
public void run(){
System.out.println("第" + start + "个线程正在运行!");
try {
RandomAccessFile raf = new RandomAccessFile(file , "rw");
long len = raf.length();
raf.seek(len*start/parts); //跳到第start部分开始读
byte[] buf = new byte[(int)(len/parts)]; //读取len/parts个字节
raf.read(buf);
raf.close();
int index = file.lastIndexOf(".");
String newFileName = file.substring(0,index) + "_bak" + file.substring(index);
raf = new RandomAccessFile(newFileName, "rw");
raf.seek(len*start/parts);
raf.write(buf);
raf.flush();
raf.close();
} catch (FileNotFoundException e) {
//e.printStackTrace();
} catch (IOException e) {
//e.printStackTrace();
}
}
}