文件的模块化上传
读取
//获取文件 File sourceFile = new File("D:\\PR\\剪辑材料\\文件传输\\1.mp4"); //读取指定文件的内容,r表示只读,不能对其进行修改 RandomAccessFile sfr = new RandomAccessFile(sourceFile, "r"); //定义一个文件用来接受读取文件(存放读取文件) String chunkDirPath = "D:\\PR\\剪辑材料\\文件传输\\chunk\\"; //指定存储文件的大小 int chunkSize = 1024 * 1024; //计算出一个文件分割成多个块所需要的块数,向上取整 int chunkNum = (int) Math.ceil(sourceFile.length() * 1.0 / chunkSize); //定义数组用来储存字节,用于暂存从源文件读取的数据 byte[] bytes = new byte[1024]; //对块数进行循环遍历 for (int i = 0; i < chunkNum; i++) { //创建一个新的文件,让其接受原文件的字节,并且以下标命名 File file = new File(chunkDirPath + i); //创建以恶搞RandomAccessFile对象,用来对文件进行读取和写入 RandomAccessFile rw = new RandomAccessFile(file, "rw"); // int len = -1; //从RandomAccessFile 对象 sfr 中读取数据,并将读取的内容存储到字节数组 bytes 中 while ((len = sfr.read(bytes))!=-1){ //它接受一个字节数组 bytes 作为参数,表示要将读取的数据存储到这个字节数组中 //将字节数组 bytes 中的数据写入到随机访问文件 rw 中的当前位置 rw.write(bytes,0,len); if (file.length()>=chunkSize){ break; } } }
-
首先,指定了要读取的源文件路径为 "D:\PR\剪辑材料\文件传输\1.mp4",并创建了对应的
File
对象sourceFile
。 -
使用
RandomAccessFile
类以只读模式打开源文件。 -
指定了存放分割块的目录路径为 "D:\PR\剪辑材料\文件传输\chunk"。
-
定义了一个块的大小
chunkSize
,这里是 1024 * 1024 字节,即 1 MB。 -
计算出需要将源文件分割成多少块,通过将源文件的长度除以块大小,并向上取整得到
chunkNum
。 -
创建一个长度为 1024 的字节数组
bytes
,用于暂存从源文件读取的数据。 -
使用循环遍历每个块,从 0 到
chunkNum-1
。 -
在每次循环中,创建一个新的文件对象
file
,用来存储当前块的数据。 -
创建一个新的
RandomAccessFile
对象rw
,以读写模式打开要写入的文件。 -
进入一个内部循环,在这个循环中从源文件中读取数据到字节数组
bytes
中,然后将该数据写入到当前块的文件中。 -
内部循环结束的条件是:要么读取到文件末尾(
read()
返回 -1),要么当前块文件的长度达到了chunkSize
。 -
如果当前块文件的长度达到了
chunkSize
,则退出内部循环,继续下一个块的处理。
解析
//定义一个文件用来接受读取的字节 File file = new File("D:\\PR\\剪辑材料\\文件传输\\2.mp4"); //创建以恶搞RandomAccessFile对象用来读取file文件 RandomAccessFile rw = new RandomAccessFile(file, "rw"); //判断file文件是否为空 if (!file.exists()){ file.createNewFile(); } //创建一个文件用来获取暂存文件的块 File chunkDir = new File("D:\\PR\\剪辑材料\\文件传输\\chunk"); //创建了一个 File 数组 files,并将指定目录 chunkDir 中的所有文件和子目录列出,并存储在这个数组中 File[] files = chunkDir.listFiles(); //对files数组按照文件名所代表的数字大小进行排序,防止文件读取时的随机性 Arrays.sort(files,(f1,f2)->Long.compare(Long.valueOf(f1.getName()),Long.valueOf(f2.getName()))); //创建一个数组,用来暂存从源文件读取的数据 byte[] bytes = new byte[1024]; //对files遍历 for (File file1 : files) { //创建一个RandomAccessFile对象r用来读取每一个块文件 RandomAccessFile r = new RandomAccessFile(file1, "r"); int len = -1; //接受一个字节数组 bytes 作为参数,表示要将读取的数据存储到这个字节数组中 while ((len=r.read(bytes))!=-1){ rw.write(bytes,0,len); } }
-
首先,通过
RandomAccessFile
类创建了一个rw
对象,用于读取和写入文件 "D:\PR\剪辑材料\文件传输\2.mp4"。 -
然后,检查指定的文件是否存在,如果不存在则创建一个新文件。
-
接着,创建一个
File
对象chunkDir
,代表了文件夹 "D:\PR\剪辑材料\文件传输\chunk"。 -
使用
chunkDir.listFiles()
方法获取该文件夹下的所有文件和子文件夹,并存储在files
数组中。 -
使用
Arrays.sort
方法对files
数组进行排序,排序的依据是文件名所代表的数字大小。 -
创建一个字节数组
bytes
,用于暂存从源文件读取的数据。 -
对
files
数组进行遍历,针对每个文件,使用RandomAccessFile
类创建一个r
对象,用于读取文件内容。 -
使用
r.read(bytes)
方法读取文件内容到字节数组bytes
中,然后使用rw.write(bytes, 0, len)
方法将读取到的数据写入到目标文件中,直到文件读取结束。