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);
}
}
利用断点流实现继续下载(实际就是利用断点流seek()方法)
最新推荐文章于 2024-07-12 13:19:56 发布