断点续传:使用java对大文件进行分块与合并
通常我们下载上传的视频文件比较大。虽然https协议没有规定上传文件大小的限制,但是网络的质量,电脑硬件的参差不齐可能会导致大文件快要上传完成的时候突然断网了要重新上传,非常影响用户体验。以此我们引入了断点续传的功能。
什么是断点续传呢?就是我们在上传下载文件的时候,将一个大文件人为的分成一些小文件。后续即便是遇到了网络故障,我们也可以在网络恢复后继续进行未完成的部分,没必要重新开始。
采用java的IO流实现文件的分块与合并
@Test public void testChunk() throws IOException { // 源文件 File file = new File("E:\\mini\\testForChunk.mp4"); // 分后的路径 String chunkPath = "E:\\mini\\chunk\\"; File chunkFolder = new File(chunkPath); if (!chunkFolder.exists()) { chunkFolder.mkdirs(); } // 1MB int chunkSize = 1024 * 1024; int chunkNum = (int) Math.ceil(file.length() * 1.0 / chunkSize); System.out.println(chunkNum); // 使用流读数据再向块中写数据 RandomAccessFile raf_r = new RandomAccessFile(file, "r"); byte[] bytes = new byte[chunkSize]; for (int i = 0; i < chunkNum; i++) { File chunkFile = new File(chunkPath + i); // 分块文件写入流 RandomAccessFile raf_rw = new RandomAccessFile(chunkFile, "rw"); int len=-1; while ((len = raf_r.read(bytes)) != -1) { raf_rw.write(bytes, 0, len); if (chunkFile.length() >= chunkSize) { break; } } raf_rw.close(); } raf_r.close(); } @Test public void testMerge() throws IOException { File chunkFolder = new File("E:\\mini\\chunk\\"); File mergeFile = new File("E:\\mini\\merge.mp4"); // 取出所有分块文件 File[] files = chunkFolder.listFiles(); Arrays.sort(files, new Comparator<File>() { @Override public int compare(File o1, File o2) { return Integer.parseInt(o1.getName())-Integer.parseInt(o2.getName()); } }); RandomAccessFile write = new RandomAccessFile(mergeFile, "rw"); byte[]bytes=new byte[1024]; for (File file : files) { RandomAccessFile read = new RandomAccessFile(file, "r"); int len=-1; while (((len = read.read(bytes)) != -1)) { write.write(bytes,0,len); } read.close(); } write.close(); }
标签:
软件工程日报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~