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.里面维护了一个数组,内部定义了字符的读和 ...
随机推荐
- SpringMVC框架 SpringMVC的获取01
---恢复内容开始--- SpringMVC通过实现MVC模式,很好地将数据.业务与展现进行了分离.从MVC的角度来说,SpringMVC和Struts2非常类似,但SpringMVC采用了可插拔的组 ...
- spring-mybatis源码追踪
启用一个扫描类 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <propert ...
- 【汉化】Acunetix Web Vulnerability Scanner 11.x汉化包
破解补丁::http://www.52pojie.cn/thread-609275-1-1.html 汉化界面截图: 登陆界面 仪表盘 目标 漏洞 扫描 用户配置 汉化详情: 1.对UI界面大部分 ...
- $.ajax()——超时设置,增加 loading 提升体验
前端发送Ajax请求到服务器,服务器返回数据这一过程,因原因不同耗时长短也有差别,且这段时间内页面显示空白.如何优化这段时间内的交互体验,以及长时间内服务器仍未返回数据这一问题,是我们开发中不容忽视的 ...
- SQL查询表结构的语句
SELECT tableName=CASE WHEN a.colorder=1 THEN d.name ELSE '' END ,表说明 =CASE WHEN a.colorder=1 THEN IS ...
- mysql常用日期、时间查询
好记性不如烂笔头 select curdate(); --获取当前日期 select last_day(curdate()); --获取本月最后一天. day); -- 获取本月第一天 ,interv ...
- Centos7 DNS神奇的配置
文件 [root@iff etc]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to co ...
- spring boot快速入门 1 :创建项目、 三种启动项目方式
准备工作: (转载)IDEA新建项目时,没有Spring Initializr选项 最近开始使用IDEA作为开发工具,然后也是打算开始学习使用spring boot. 看着博客来进行操作上手sprin ...
- Map集合的四种遍历方式(转载)
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { pu ...
- android studio2.3.3 模拟器 Jni函数调用C++对象,lldb调试this指针和相关变量显示无效的原因
android studio2.3.3 的版本中 Jni函数调用C++对象,对象调用相关的成员函数, lldb调试,变量跟踪窗口,this指针和相关变量显示无效的原因,但这些参数实际是有效的,只是de ...