1.如何用Java进行分割文件

分割大文件实际上就是对文件进行分批次下载,三个线程利用RandomAcessFile流在不同位置并行下载并传入一个文件或多个文件

具体已经实现如下

下载demo21.zip

我们平时下载的操作是直接通过一个网络请求获得一整个文件,并用流进行传输

而分割大文件下载则是通过三个线程进行三个网络请求,访问同一个连接,每一个连接都下载不同位置的字节,最后合并

主要操作

1.利用java.net.HttpURLConnection包下的URL类接入我们需要分割的大文件的链接地址

2.创建一个HttpURLConnection指向这个链接并开启连接

方便起见,这里我们使用nginx创建一个本地连接,使我们的url指向我们的本地nginx服务器

nginx文件的配置文件nginx.conf如下

注意标红

然后在相应的位置,我们指向我们存放需要分割文件的位置

downloadFile方法如下

然后在我们的磁盘中,在D盘新建一个staticService文件夹,并根据路径,创建我们需要分割的文件

然后启动nginx.exe

(双击nginx.exe会弹出命令指示符,然后瞬间消失。由于不知道你是否成功启动了nginx.exe,建议查看任务管理器并搜索ngnix.exe)

(os:你也可以用cmd指向nginx.exe文件直接启动,若无报错,则你的nginx就启动成功了)

如下:

这样我们就启动成功了

3.利用File类创建file对象,指定下载位置并确保文件的父文件是否并确保存在

4.根据线程数量,我们标记文件大小,计算每一个线程需要下载的字节块大小,创建相应的线程并执行分割大文件的任务

5.定义多线程下载任务*

  • 打开DownloadThread文件,我们能看到我们先前的参数可以被构造器正确的传入每一个线程对象中。

其中起始点需要我们着重去计算一下,每一个线程负责不同的字节块。所以他们的起始点不同(第一个线程下载第一个块,第二个下载第二个快,以此类推 ->startPoint = this.block * i(i为当前线程的批次))。

*最重要的是,由于奇数进行除法运算时会被取下整,为了防止文件下载时文件下载不完全,导致文件无法被打开,我们要对结尾加上1使其防止被下整运算(偶数也+1直接会被下整运算,所以无所谓)。

(这会导致一个bug,如音乐,还是字符文件,每一个线程都会下载到下一个线程需要下载的内容,可能会出现音乐卡顿,重复等问题)

  • 接下来就要定义线程下载任务run方法了

这个任务可以这样解释:

一.创建连接,指向需要下载的文件

*二.设置请求头为Range(Parties Content分段下载),并传入参数"bytes=当前起始点-结尾"

三.获取连接流,使用RandomAcessFile流指定文件位置,操作方式,文件写入位置

四.将流写入一个字节数组,获取它的长度,进行一个循环,直到流内不存在数据字节之后,跳出循环

五.关闭RandomAcessFile流

至此设置任务结束,让我们看看运行结果

可以看到音乐文件已经被我们正确通过多线程下载到了resources文件夹下,并可以正确播放