IO实战-RandomAccessFile在本地实现伪断点续传
准备:在磁盘中 准备一个目录文件
实现:将该文件复制到目标路径中,关掉程序,再重新打开可以在原位置继续复制。
需求如下:
- 过程中显示文件的拷贝的百分比
- 复制过程中关掉程序。
- 重新启动该程序时,若上次没有拷贝完,则提示上次拷贝还没完成,是否从上次的位置开始拷贝! 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在本地实现伪断点续传的更多相关文章
- Java IO的RandomAccessFile的使用(转)
现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”.可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实 ...
- Zookeeper安装(本地,伪分布式,集群)
概述 ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization).命名服务(Namin ...
- 【一】、搭建Hadoop环境----本地、伪分布式
## 前期准备 1.搭建Hadoop环境需要Java的开发环境,所以需要先在LInux上安装java 2.将 jdk1.7.tar.gz 和hadoop 通过工具上传到Linux服务器上 3. ...
- 2.hadoop基本配置,本地模式,伪分布式搭建
2. Hadoop三种集群方式 1. 三种集群方式 本地模式 hdfs dfs -ls / 不需要启动任何进程 伪分布式 所有进程跑在一个机器上 完全分布式 每个机器运行不同的进程 2. 服务器基本配 ...
- Java—IO流 RandomAccessFile类
RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. java文件模型,在硬盘上的文件是byte byte byt ...
- Java IO 之 RandomAccessFile 操作文件内容
RandomAccessFile类实现对文件内容的随机读写 文件内容的随机操作,重难点在于字符操作,具体查看API package org.zln.io.file; import java.io.IO ...
- Hadoop 安装(本地、伪分布、分布式模式)
本地模式 环境介绍 一共三台测试机 master 192.168.4.91 slave1 192.168.4.45 slave2 192.168.4.96 操作系统配置 1.Centos7 ...
- java 输入输出IO流 RandomAccessFile文件的任意文件指针位置地方来读写数据
RandomAccessFile的介绍: RandomAccessFile是Java输入输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出 ...
- 021.13 IO流 RandomAccessFile对象
对象和方法:RandomAccessFile:文件操作对象,Java提供getFilePointer:获取文件指针 特点:1.只能操作文件2.既能读,又能写3.里面维护了一个数组,内部定义了字符的读和 ...
随机推荐
- leecode刷题(18)-- 报数
leecode刷题(18)-- 报数 报数 描述: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 1112 ...
- elasticsearch5.2.1使用logstash同步mysql
centos 本人亲测可以 首先安装好mysql,elasticsearch 不懂的请参考另一篇文章 安装logstash官方:https://www.elastic.co/guide/en/l ...
- java使用memcached1--安装与基本使用
环境 CentOs6.4 libevent-2.0.22-stable memcached-1.4.24 一.memcached安装 # cd /usr/local 1.编译安装libevent # ...
- [Swift实际操作]七、常见概念-(13)使用UIScreen查询设备屏幕信息
本文将为你演示,如何获得设备的屏幕信息,了解设备的屏幕尺寸等信息,才能做出适配性更好的应用程序. 首先导入需要使用到的界面工具框架 import UIKit 然后通过UIScreen类,就可以获得设备 ...
- 修改linux的文件时,如何快速找到要修改的内容
♦ 在linux系统下,找到需要修改的文件.使用cd+目录的命令进行文件所在的目录,使用ls命令查看是否有该文件. ♦ 使用vim+文件名,打开该文件 ♦ 快速在文件中找到需要修改的地方.如我们需要修 ...
- STM32-增量式旋转编码器测量
Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6 一.增量式旋转编码器 1.简介 编码器(encoder)是将信号(如比特流)或数据进行编制.转换为可 ...
- 2016级算法期末模拟练习赛-E.AlvinZH的青春记忆III
1083 AlvinZH的青春记忆III 思路 难题,二分图. 说这是一个考察二分图的题目,你可以会说"不可能",这哪里像一个二分图了!这真的是一个二分图,考察的是最小顶点覆盖. ...
- Spring Boot 笔记汇总
使用IDEA搭建Spring Boot入门项目 从零开始完整搭建 Spring-Boot 项目开发框架的教程 IDEA通过Maven WebApp archetype 创建Spring boot项目骨 ...
- 汉诺塔的python 动画演示
1.简介 古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个 ...
- SBC应用
在VoIP呼叫中主要使用会话发起协议(SIP),H.323和MGCP呼叫信令协议,Sbc 在主叫和被叫的信令/媒体路径之间引入. 通常,SBC隐藏网络拓扑,接管呼入并生成到新的请求分支到被叫.技术上叫 ...