利用断点流实现继续下载(实际就是利用断点流seek()方法)

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class ContinueCopy {

	
	public void copy(File file,File dir){
		RandomAccessFile raf_read = null;
		RandomAccessFile raf_write = null;
		int count = 0;
		long position = 0;//记录当前读写的位置
		try {
			position = readPosition(dir);
			//以只读模式开启一个文件访问流
			raf_read = new RandomAccessFile(file,"r");
			File target = new File(dir,file.getName());
			//以读写模式开启一个文件访问流
			raf_write = new RandomAccessFile(target,"rw");
			//读写指针跳到指定位置
			raf_read.seek(position);
			raf_write.seek(position);
			
			byte[] b = new byte[1024];
			int len = 0;
			System.out.println("准备开始拷贝....");
			while((len = raf_read.read(b)) != -1){
				count++;
				position += len;//文件指针未知改变
				System.out.println("---》"+count);
//				if(count==8800){
//					System.out.println("出现异常,拷贝终止-->"+position);
//					throw new Exception();
//				}
				raf_write.write(b, 0, len);
			}
			new File(dir,"len.txt").delete();
		}catch (Exception e) {
			//记录当前未知
			writePosition(position, dir);
			e.printStackTrace();
		}finally{
			try {
				if(raf_write != null)raf_write.close();
				if(raf_read != null)raf_read.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 实时记录文件拷贝(下载)到的目标位置
	 * @param position
	 * @param dir
	 */
	public void writePosition(long position,File dir){
		RandomAccessFile raf = null;
		try {
			raf = new RandomAccessFile(new File(dir,"len.txt"),"rw");
			raf.writeLong(position);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(raf != null)raf.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 读取记录长度的文件中文件指针的位置
	 * @param dir
	 * @return
	 */
	public long readPosition(File dir){
		RandomAccessFile raf = null;
		try {
			raf = new RandomAccessFile(new File(dir,"len.txt"), "r");
			//raf.seek(0);
			return raf.readLong();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(raf != null)raf.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return 0L;
	}
	
	public static void main(String[] args) {
		File source = new File("D:\\素材\\视频\\larva搞笑虫子\\1.mp4");
		File dir = new File("C:\\Users\\mrchai\\Desktop\\test");
		new ContinueCopy().copy(source, dir);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值