准备:在磁盘中 准备一个目录文件

实现:将该文件复制到目标路径中,关掉程序,再重新打开可以在原位置继续复制。

需求如下:

  1. 过程中显示文件的拷贝的百分比
  2. 复制过程中关掉程序。
  3. 重新启动该程序时,若上次没有拷贝完,则提示上次拷贝还没完成,是否从上次的位置开始拷贝! 1. 是:从上次结束的位置继续拷贝。0 否:从头开始拷贝

代码如下:

public class Test02 {

	public static void main(String[] args) {

		File srcFile = new File("D:/test/test.zip");
File dstFile = new File("D:/test/test2.zip");
File logFile = new File(dstFile.getParentFile(),dstFile.getName() + ".log.raf");
RandomAccessFile logRaf = null;
long start = 0L;
try {
if(logFile.exists() && logFile.length() > 0){ Scanner sc = new Scanner(System.in);
System.out.println("上次拷贝结束:1 继续拷贝 0重新拷贝");
switch (sc.nextInt()) {
case 1:
logRaf = new RandomAccessFile(logFile, "rw");
start = logRaf.readLong();
copy(srcFile,dstFile,start);
break;
case 0:
copy(srcFile,dstFile,start);
default:
System.out.println("输入错误,请输入一个 0或1 的数字 进行选择");
break;
} }else{
copy(srcFile,dstFile,start);
}
} catch (Exception e) {
e.printStackTrace();
} } public static void copy(File srcDir,File dstFile,long start){ long length = srcDir.length();
File logRaf = new File(dstFile.getParentFile(),dstFile.getName() + ".log.raf");
RandomAccessFile srcRandom = null;
RandomAccessFile dstRandom = null;
RandomAccessFile logRandom = null;
try { if(length == 0){
return;
} srcRandom = new RandomAccessFile(srcDir, "rw");
dstRandom = new RandomAccessFile(dstFile, "rw");
logRandom = new RandomAccessFile(logRaf, "rw"); long sum = start;
int read = -1;
int startavg = 0;
byte b[] = new byte[1024];
srcRandom.seek(start);
while((read = srcRandom.read(b)) != -1){
dstRandom.write(b,0,read);
sum += read; int avg = (int)(100 * sum/length);
if(avg > startavg){
System.out.println("已经完成了%:" + avg);
startavg = avg;
}
logRandom.seek(0);
logRandom.writeLong(sum);
Thread.currentThread().sleep(1);//降低写的速度 效果明显
} } catch (Exception e) {
e.printStackTrace();
} finally { if(logRandom != null){
try {
logRandom.close();
} catch (IOException e) {
e.printStackTrace();
}
} if(dstRandom != null){
try {
dstRandom.close();
} catch (IOException e) {
e.printStackTrace();
}
} if(srcRandom != null){
try {
srcRandom.close();
} catch (IOException e) {
e.printStackTrace();
}
}
logRaf.delete();
} }

最新文章

  1. Sublime Text 基础配置
  2. 对​O​p​e​n​C​V​直​方​图​的​数​据​结​构​C​v​H​i​s​t​o​g​r​a​m​的​理​解
  3. 【POJ3691】DNA repair(AC自动机,DP)
  4. 51NOD算法马拉松11 B君的竞技场
  5. jQuery_04之第三方、自定义
  6. 使用WITH AS提高性能简化嵌套SQL
  7. zw版【转发·台湾nvp系列Delphi例程】HALCON DispCross
  8. fstream对象重复使用时注意clear()的调用
  9. sqrt (x) 牛顿迭代法
  10. cnetos6.4 x64 阿里云环境初探--安装pip,及pymysql
  11. ServiceStack.Redis里List的Insert操作
  12. MyBatis学习笔记1--初识MyBatis
  13. Go基础--goroutine和channel
  14. 使用sshfs将远程目录挂载到本地
  15. Python基础(二)自定义函数
  16. JMeter—监听器(十二)
  17. 【JavaScript】获取当前页的URL与window.location.href
  18. jenkins--svn+Email自动触发2(jenkins系统配置)
  19. 树莓派上使用DHCPig进行DHCP池耗尽攻击
  20. python中执行shell的两种方法总结

热门文章

  1. 真机测试 Thnetwork connection was lost. No profiles for 'xxx' were found: Xcode couldn't find a provisioning profile matching 'xxx'. Code signing is required for product type
  2. CentOS7安装weblogic集群思路梳理
  3. luoguP5074 Eat the Trees
  4. FTP枢轴攻击
  5. elasticsearch 5.6.4自动创建索引与mapping映射关系 +Java语言
  6. 对于一些seo查询网站的整理
  7. ltp-ddt eth过程中遇到的问题
  8. python怎么解决用matplotlib画图时无法显示中文的问题或者出现方框的问题
  9. Mac下使用Wine安装Notepad++
  10. mono for android 第四课--提示框(转)