# 文件的模块化上传

文件的模块化上传

读取

//获取文件
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;
        }
    }
}
  1. 首先,指定了要读取的源文件路径为 "D:\PR\剪辑材料\文件传输\1.mp4",并创建了对应的File对象 sourceFile

  2. 使用 RandomAccessFile 类以只读模式打开源文件。

  3. 指定了存放分割块的目录路径为 "D:\PR\剪辑材料\文件传输\chunk"。

  4. 定义了一个块的大小 chunkSize,这里是 1024 * 1024 字节,即 1 MB。

  5. 计算出需要将源文件分割成多少块,通过将源文件的长度除以块大小,并向上取整得到 chunkNum

  6. 创建一个长度为 1024 的字节数组 bytes,用于暂存从源文件读取的数据。

  7. 使用循环遍历每个块,从 0 到 chunkNum-1

  8. 在每次循环中,创建一个新的文件对象 file,用来存储当前块的数据。

  9. 创建一个新的 RandomAccessFile 对象 rw,以读写模式打开要写入的文件。

  10. 进入一个内部循环,在这个循环中从源文件中读取数据到字节数组 bytes 中,然后将该数据写入到当前块的文件中。

  11. 内部循环结束的条件是:要么读取到文件末尾(read() 返回 -1),要么当前块文件的长度达到了 chunkSize

  12. 如果当前块文件的长度达到了 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);
    }
}
  1. 首先,通过 RandomAccessFile 类创建了一个 rw 对象,用于读取和写入文件 "D:\PR\剪辑材料\文件传输\2.mp4"。

  2. 然后,检查指定的文件是否存在,如果不存在则创建一个新文件。

  3. 接着,创建一个 File 对象 chunkDir,代表了文件夹 "D:\PR\剪辑材料\文件传输\chunk"。

  4. 使用 chunkDir.listFiles() 方法获取该文件夹下的所有文件和子文件夹,并存储在 files 数组中。

  5. 使用 Arrays.sort 方法对 files 数组进行排序,排序的依据是文件名所代表的数字大小。

  6. 创建一个字节数组 bytes,用于暂存从源文件读取的数据。

  7. files 数组进行遍历,针对每个文件,使用 RandomAccessFile 类创建一个 r 对象,用于读取文件内容。

  8. 使用 r.read(bytes) 方法读取文件内容到字节数组 bytes 中,然后使用 rw.write(bytes, 0, len) 方法将读取到的数据写入到目标文件中,直到文件读取结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值