通常我们下载上传的视频文件比较大。虽然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(); }
标签:断点续传,java,int,bytes,对大,RandomAccessFile,len,File,new From: https://www.cnblogs.com/kun1790051360/p/18284860