RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的"内存映射文件(memory-mapped files)"给取代了,你该考虑一下是不是用"内存映射文件"来代替RandomAccessFile了。
以下是实例源代码:
public class ContinueCopy { public void copy(File file,File dir){ RandomAccessFile raf_read = null; RandomAccessFile raf_write = null; long position = 0; int count = 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; if(count == 8800){ System.out.println("出现异常,拷贝终止-->"+position); throw new Exception(); } //获取文件指针的位置 raf_write.write(b,0,len); } new File(dir,"len.txt").delete(); System.out.println("拷贝完成"); } 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(); } } } //实时地记录文件拷贝(下载)到目标位置 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(); } } } 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:/test1/1.mp4"); File dir = new File("d:/1/"); new ContinueCopy().copy(source, dir); } }
