首页 > 编程语言 >java中如何对特大文件做断点续传RandomAccessFile

java中如何对特大文件做断点续传RandomAccessFile

时间:2023-10-07 12:00:12浏览次数:48  
标签:断点续传 java 文件 RandomAccessFile httpConn fileSize File

Java 中可以使用 RandomAccessFile 类来实现特大文件的断点续传功能。

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.HttpURLConnection;

public class ResumeDownloadExample {
public static void main(String[] args) {
String fileURL = "http://example.com/largefile.zip";
String saveDir = "C:/downloads/";
String fileName = "largefile.zip";

// 初始化下载路径和保存目录
File dir = new File(saveDir);
if (!dir.exists()) {
dir.mkdirs();
}

try {
URL url = new URL(fileURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();

// 尝试获取文件的大小
long fileSize = getFileSize(httpConn);
System.out.println("Total file size: " + fileSize + " bytes");

// 创建一个随机访问文件对象
RandomAccessFile file = new RandomAccessFile(new File(saveDir + fileName), "rw");

// 检查本地文件是否存在
long localFileSize = file.length();
if (localFileSize >= fileSize) {
System.out.println("File already downloaded.");
return;
}

// 设置下载的起始位置
httpConn.setRequestProperty("Range", "bytes=" + localFileSize + "-");

// 获取输入流以读取数据
httpConn.connect();
byte[] buffer = new byte[1024];
int bytesRead = -1;

// 循环读取数据,并将其写入文件
while ((bytesRead = httpConn.getInputStream().read(buffer)) != -1) {
file.write(buffer, 0, bytesRead);
}

System.out.println("File downloaded successfully.");

// 关闭文件和连接
file.close();
httpConn.disconnect();

} catch (IOException e) {
e.printStackTrace();
}
}

// 获取文件大小的方法
private static long getFileSize(HttpURLConnection httpConn) {
long fileSize = -1;
String contentLength = httpConn.getHeaderField("Content-Length");
if (contentLength != null) {
fileSize = Long.parseLong(contentLength);
}
return fileSize;
}
}

代码会根据指定的文件 URL,将文件下载到指定的保存目录中。当程序再次运行时,它会检查本地文件的大小,如果已经完成了下载,则不会重新下载。

注意,这只是一个基本示例,并未处理网络异常、文件重命名等边缘情况。在实际使用中可能还需要添加一些错误处理和完善断点续传的逻辑。

参考文章:http://blog.ncmem.com/wordpress/2023/10/07/java%e4%b8%ad%e5%a6%82%e4%bd%95%e5%af%b9%e7%89%b9%e5%a4%a7%e6%96%87%e4%bb%b6%e5%81%9a%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0randomaccessfile/

欢迎入群一起讨论

 

标签:断点续传,java,文件,RandomAccessFile,httpConn,fileSize,File
From: https://www.cnblogs.com/songsu/p/17745965.html

相关文章

  • Java 学习笔记
    Java学习笔记dos环境下(Windows即cmd)的Java命令先用javac文件名.java;命令,编译java文件,生成一个后缀为class、名与类名相同的文件。再用java类名命令,执行文件。当类名前的修饰符为public时,类名必须和源文件名一致。并且以上操作不能执行带package的java文......
  • JAVA学习笔记1
    private封装extends继承编译类型是爷爷多态整个继承过程构造器必须首行引用爷爷的构造器(用super)点击查看代码packagecom.hspstudy.Test1;publicclassExtend_{publicstaticvoidmain(String[]a){GraFathergraFather=newGraFather("勤才",......
  • Java 常用开发总结
    Java8集合篇ListStream常用操作1List去重publicclassStreamTest{@Testpublicvoidtest_listDistinct(){List<String>oldList=Arrays.asList("a","b","a","c");List<String>newLi......
  • Java抽象类与接口的区别(略解)
    抽象类 接口抽象类与接口区别1.抽象类抽象类用abstract来修饰,例如:packagecom.test.abstractaaa;publicabstractclassTestAbstract{}抽象类是用来捕捉子类的通用性的,它不能被实例化,只能用作子类的超类,抽象类是被用来创建继承层级里子类的模板,例如JDK中......
  • 深入浅出 Java 中的神锁:ReentrantLock,还有谁不会?
    来源:jiannan.blog.csdn.net/article/details/121331360一、引言话不多说,扶我起来,我还可以继续撸。在学习ReentrantLock源码之前,先来回顾一下链表、队列数据结构的基本概念~~二、数据结构2.1链表(LinkedList)小学一、二年级的时候,学校组织户外活动,老师们一般都要求同学之间小......
  • 深入理解Java的接口与抽象类
    深入理解Java的接口和抽象类对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java......
  • JavaScript 技术
    JavaScript是一种脚本语言,主要用于在Web页面中实现交互效果和动态功能。它是一种客户端脚本语言,意味着它在用户的浏览器中运行,而不是在服务器上。JavaScript具有以下特点和技术:1.事件驱动:JavaScript可以通过监听用户的交互事件(如点击、鼠标移动、键盘输入等)来触发相应的动作和......
  • JavaScript(二)——DOM
    WebAPIs一个页面就是一个文档(document),标签是元素(element),内容是节点(node),DOM中把以上内容都看作对象。DOM文档对象模型获取DOM元素document.querySelector('')//返回匹配到的第一个元素.box、#id、div一个或多个选择器document.querySelectorAll('')//匹配到符合的元素集(伪......
  • 基于注解的装配、以及纯Java配置(不用xml)
    1、基于注解的装配参考课本以及陈恒spring教材很好理解,还参考了https://blog.csdn.net/huweiliyi/article/details/107641886(偏向代码分析)https://www.bilibili.com/video/BV1tM4y1Y7Jf/?spm_id_from=333.337.search-card.all.click&vd_source=af888e4b9fbc70c4d5e7a445796ae8a1(......
  • JavaSE核心(5)
    四:面向对象   一、简介      1.概念:面向对象也即OOP(ObjectOrientedProgramming),是一种编程思想,它以对象作为基本的单元来构建系统,具有三大特征和五大原则。      2.三大特征:          1.封装:隐藏对象的属性和实现细节,仅对外提供公共访问方......