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

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

需求如下:

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

IO实战-RandomAccessFile在本地实现伪断点续传的更多相关文章

  1. Java IO的RandomAccessFile的使用(转)

    现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”.可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实 ...

  2. Zookeeper安装(本地,伪分布式,集群)

    概述 ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization).命名服务(Namin ...

  3. 【一】、搭建Hadoop环境----本地、伪分布式

    ##  前期准备 1.搭建Hadoop环境需要Java的开发环境,所以需要先在LInux上安装java 2.将    jdk1.7.tar.gz 和hadoop 通过工具上传到Linux服务器上 3. ...

  4. 2.hadoop基本配置,本地模式,伪分布式搭建

    2. Hadoop三种集群方式 1. 三种集群方式 本地模式 hdfs dfs -ls / 不需要启动任何进程 伪分布式 所有进程跑在一个机器上 完全分布式 每个机器运行不同的进程 2. 服务器基本配 ...

  5. Java—IO流 RandomAccessFile类

    RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. java文件模型,在硬盘上的文件是byte byte byt ...

  6. Java IO 之 RandomAccessFile 操作文件内容

    RandomAccessFile类实现对文件内容的随机读写 文件内容的随机操作,重难点在于字符操作,具体查看API package org.zln.io.file; import java.io.IO ...

  7. Hadoop 安装(本地、伪分布、分布式模式)

    本地模式 环境介绍 一共三台测试机 master   192.168.4.91 slave1   192.168.4.45 slave2   192.168.4.96 操作系统配置 1.Centos7 ...

  8. java 输入输出IO流 RandomAccessFile文件的任意文件指针位置地方来读写数据

    RandomAccessFile的介绍: RandomAccessFile是Java输入输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出 ...

  9. 021.13 IO流 RandomAccessFile对象

    对象和方法:RandomAccessFile:文件操作对象,Java提供getFilePointer:获取文件指针 特点:1.只能操作文件2.既能读,又能写3.里面维护了一个数组,内部定义了字符的读和 ...

随机推荐

  1. [bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT

    Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...

  2. 《快学Scala》第六章 对象 第七章 包和引入

  3. 服务器变量 $_SERVER 详解

    摘抄:http://ha.cker.in/942.seo 1.$_SESSION[‘PHP_SELF’] — 获取当前正在执行脚本的文件名 2.$_SERVER[‘SERVER_PROTOCOL’] ...

  4. PHP之编写日志文件留后门(免杀)

    (我知道你们都喜欢干货,所以也没亏待你们,请到文末吧,成果附件已上传~) 本文原创作者:Laimooc(原名xoanHn) 鄙人宗旨: 本人秉着爱学习爱恶搞爱研究爱进步并且遵纪守法的心态写下这篇文章, ...

  5. Bootstrap中表单控件状态(验证状态)

      Bootstrap 表单 http://www.runoob.com/try/try2.php?filename=bootstrap3-form-controlstate (这链接里有简介) &l ...

  6. Linux动态库的导出控制

    在实际工作中,许多软件模块是以动态库的方式提供的.做为模块开发人员,我们不仅要掌握如何编写和构建动态库,还要了解如何控制动态库的导出接口,这样,我们可以向模块的用户仅导出必要的接口,而另一些内部接口, ...

  7. saltstack 动态pillar实现

    简介 pillar支持的数据存储方式有很多,mysql, mogo,json等.本篇介绍关于http存储方式. 首先简要说明整个流程:salt-master会去一个指定http发送get请求获取一个j ...

  8. mysql中字符串1.1/1.2/1.2.2/1.2.5排序问题

    1.创建查询函数:(split_pid为函数名称) create function split_pid(str varchar (1000),delimiter varchar(1)) returns ...

  9. Android之build.prop属性详解

    注:本篇文章是基于MSD648项目(AndroidTV)的prop进行说明. Android版本:4.4.4 内核版本:3.10.86 1.生成build.prop build.prop的生成是由ma ...

  10. idea 验证码

    N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iLCJhc3NpZ25lZU5hbWUiO ...