分段下载文件--java版

迅雷在下载东西的时候把一个文件分割成好几部分,用几个线程一起下载,以此来提高下载的速度。

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();
		}
	}
}
 

你可能感兴趣的:(java,多线程,thread,F#)