一、作用:

随机流(RandomAccessFile)不属于IO流,支持对文件的读取和写入随机访问。

二、随机访问文件原理:

首先把随机访问的文件对象看作存储在文件系统中的一个大型 byte 数组,然后通过指向该 byte 数组的光标或索引(即:文件指针 FilePointer)在该数组任意位置读取或写入任意数据。

三、相关方法说明:

1、对象声明:RandomAccessFile raf = newRandomAccessFile(File file, String mode);

其中参数 mode 的值可选 "r":可读,"w" :可写,"rw":可读性;

2、获取当前文件指针位置:int RandowAccessFile.getFilePointer();

3、改变文件指针位置(相对位置、绝对位置):

1> 绝对位置:RandowAccessFile.seek(int index);

2> 相对位置:RandowAccessFile.skipByte(int step); 相对当前位置

4、给写入文件预留空间:RandowAccessFile.setLength(long len);

断点续传实现原理:

1)下载断开的时候,记录文件断点的位置position;

2)继续下载的时候,通过RandomAccessFile找到之前的position位置开始下载

实际操作:

我们在D盘的根目录下创建一个名为”test.txt”的文件,文件内容很简单,如图所示:

没错,我们输入的内容就是简单的6个英语字母。然后我们右键→属性:

我们要实现的效果很简单:将在D盘的”test.txt”文件写入到E盘当中,但中途我们会模拟一次”中断”行为,然后在重新继续上传,最终完成整个过程。

也就是说,我们这里将会把“D盘”视作一台电脑,并且直接将”E盘”视作一台服务器。那么这样我们甚至都不再与http协议扯上半毛钱关系了,(当然实际开发我们肯定是还是得与它扯上关系的 ^

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.RandomAccessFile;

public class Test {

private static int position = -1;

public static void main(String[] args) {

// 源文件与目标文件

File sourceFile = new File("D:/", "test.txt");

File targetFile = new File("E:/", "test.txt");

// 输入输出流

FileInputStream fis = null;

FileOutputStream fos = null;

// 数据缓冲区

byte[] buf = new byte[1];

try {

fis = new FileInputStream(sourceFile);

fos = new FileOutputStream(targetFile);

// 数据读写

while (fis.read(buf) != -1) {

fos.write(buf);

// 当已经上传了3字节的文件内容时,模拟网络中断了,抛出异常

if (targetFile.length() == 3) {

position = 3;

throw new FileAccessException();

}

}

} catch (FileAccessException e) {

keepGoing(sourceFile, targetFile, position);

} catch (FileNotFoundException e) {

System.out.println("指定文件不存在");

} catch (IOException e) {

} finally {

try {

// 关闭输入输出流

if (fis != null)

fis.close();

if (fos != null)

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

private static void keepGoing(File source, File target, int position) {

try {

Thread.sleep(10000);

} catch (Exception e) {

e.printStackTrace();

}

try {

RandomAccessFile readFile = new RandomAccessFile(source, "rw");

RandomAccessFile writeFile = new RandomAccessFile(target, "rw");

readFile.seek(position);

writeFile.seek(position);

// 数据缓冲区

byte[] buf = new byte[1];

// 数据读写

while (readFile.read(buf) != -1) {

writeFile.write(buf);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

class FileAccessException extends Exception {

}

总结一下,我们在这次改动当中都做了什么工作:

首先,我们定义了一个变量position,记录在发生中断的时候,已完成读写的位置。(这是为了方便,实际来说肯定应该讲这个值存到文件或者数据库等进行持久化)

然后在文件读写的while循环中,我们去模拟一个中断行为的发生。这里是当targetFile的文件长度为3个字节则模拟抛出一个我们自定义的异常。(我们可以想象为实际下载中,已经上传(下载)了”x”个字节的内容,这个时候网络中断了,那么我们就在网络中断抛出的异常中将”x”记录下来)。

剩下的就如果我们之前说的一样,在“续传”行为开始后,通过RandomAccessFile类来包装我们的文件,然后通过seek将指针指定到之前发生中断的位置进行读写就搞定了。(实际的文件下载上传,我们当然需要将保存的中断值上传给服务器,这个方式通常为httpConnection.setRequestProperty(“RANGE”,”bytes=x”);)

在我们这段代码,开启”续传“行为,即keepGoing方法中:我们起头让线程休眠10秒钟,这正是为了让我们运行程序看到效果。

现在我们运行程序,那么文件就会开启“由D盘上传到E盘的过程”,我们首先点开E盘,会发现的确多了一个test.txt文件,打开它发现内容如下:

没错,这个时候我们发现内容只有“abc”。这是在我们预料以内的,因为我们的程序模拟在文件上传了3个字节的时候发生了中断。

Ok,我们静静的等待10秒钟过去,然后再点开该文件,看看是否能够成功:

通过截图我们发现内容的确已经变成了“abc”,由此也就完成了续传。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

java写入写出文件的原理_Java文件断点续传实现原理解析相关推荐

  1. Flink大数据实时计算系列-Flink写出多个parquet小文件处理方法、Presto的介绍与使用场景

    Flink大数据实时计算系列-Flink写出多个parquet小文件处理方法.Presto的介绍与使用场景 Presto的安装与使用 目录 Flink写出多个parquet小文件处理方法 Presto ...

  2. 第一集:噗?在大学几年里,用java就写出这么个破玩意儿

    噗?在大学几年里,用java就写出这么个破玩意儿(告诉你我学的视频是这些) 微信号:tofacebook-com

  3. java断点续传原理_java 文件断点续传实现原理

    关键字: RandomAccessFile 一.作用: 随机流(RandomAccessFile)不属于IO流,支持对文件的读取和写入随机访问. 二.随机访问文件原理: 首先把随机访问的文件对象看作存 ...

  4. java文件与流_Java文件和流深入

    1.什么是数据流? 数据流是指所有的数据通信通道.有两类流,InputStream and OutputStream,Java中每一种流的基本功能依赖于它们.InputStream用于read,Out ...

  5. java文件上传_Java文件上传细讲

    什么是文件上传? 文件上传就是把用户的信息保存起来. 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片.那么这张照片就应该要进行保存. 上传组件(工具) 为什么我们要使用上传工具? 为啥我 ...

  6. java文件流读取_java 文件及流读取

    在Java语言的IO编程中,读取文件是分两个步骤:1.将文件中的数据转换为流,2.读取流内部的数据.其中第一个步骤由系统完成,只需要创建对应的流对象即可,对象创建完成以后步骤1就完成了,第二个步骤使用 ...

  7. java jvm原理_JAVA和JVM运行原理

    JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. 编译器负责把Java ...

  8. java 调用 swf 文件上传_java文件上传方法

    文件上传方法(一次上传一个文件,多个文件的话,请写循环调用) Upload.uploadFile(theFile, filePath) 说明: theFile:类型是FormFile filePath ...

  9. 在java中写出html代码,在java里写html代码

    在java里写html代码 [2021-02-09 07:31:38]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

最新文章

  1. Glide 这样用,更省内存
  2. ruby语言开源Web应用框架 Ruby on Rails 简介
  3. git log 查看提交记录,参数:
  4. ViewHolder VS HolderView ?
  5. ASP.NET中生成缩略图的代码
  6. Ubicomp2018年论文列表
  7. 安装以及简单使用zookeeper
  8. 百度云虚拟服务器搭建,百度云虚拟主机实力呈现 网站搭建最优选择
  9. 甲骨文谷歌继续打官司:美最高法院同意复审 Java API 版权诉讼案
  10. 有效利用ASP.NET用户控件的事件委托
  11. 【从零开始学架构-李运华】03|架构设计的目的
  12. 风向风速传感器原理及应用
  13. (一)数字图像处理基础知识点
  14. Windows 10微软应用商店打不开问题解决方案
  15. 手机知识:手机OTG知识介绍,看完你就懂了
  16. Halo博客建站小记
  17. JavaWeb整合萤石云(一),VUE和小程序也适用
  18. 【调剂】上海电力大学控制工程 、通信工程、人工智能等专业调剂信息
  19. 怎么压缩PDF文件大小?不会操作的快看过来
  20. red hat enterprise linux yum,Red Hat Enterprise Linux7.x(RHEL7.x)更换CentOS YUM源

热门文章

  1. php使用jasperreport,JasperReport经验谈
  2. xampp 最小化不显示控制面板界面解决办法
  3. (已更新)【S-CMS企业建站系统 v5.0 】CMS+含小程序+响应式布局+支持手机版网站+支持Q旺旺客服
  4. I.MX RT1170之FlexSPI(1):FlexSPI功能框图和特性
  5. VMware虚拟机安装centos 7以及静态ip地址的配置(固定ip)
  6. 创意卡片设计(纯css)
  7. 实现音乐播放,切换和点击播放,自动循环下一首
  8. Gunicorn 配置
  9. java if return 语句_Java 语言中的 return 语句
  10. windows 10 0x80070035 找不到网络路径